)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"38bd4c925b3242938ea59764faff693d25995ee4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"df74c700_daaece08","updated":"2025-01-26 04:25:20.000000000","message":"So I like the separate secret being deployed. I would recommend just being much more simple about it. have each service use config-dir to a known path and let me provide the DB secret as a file snippet to the correct location. let me define extra volumes and mounts into the containers like a lot of other charts do and handle getting the secrets in that way.","commit_id":"7fe001b0649e7136da068fcf79cd9ee7da10efcd"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"089c67e4b0b14c3c9e136c0590ea8406b02b932c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"f6690678_d515c1eb","in_reply_to":"0e703a39_c40b9e45","updated":"2025-02-04 11:02:49.000000000","message":"And should we substitute anything in this template? or your proposal is to manage secret with snippet outside of helm in values just set its name, and mount it as is to the known location?","commit_id":"7fe001b0649e7136da068fcf79cd9ee7da10efcd"},{"author":{"_account_id":3009,"name":"Vladimir Kozhukalov","email":"kozhukalov@gmail.com","username":"kozhukalov"},"change_message_id":"0d1d8bbe235ddae4ed925b337110ba2fd6f8add2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"764b3af0_2facc17a","in_reply_to":"41d7d9d3_6c9e7532","updated":"2025-01-28 13:00:15.000000000","message":"IMO, it is easier to implement this init container wherever needed. And this pattern is more flexible than using additional configuration snippets. Anyway I am going to extend the spec and add the ability to specify additional config files.","commit_id":"7fe001b0649e7136da068fcf79cd9ee7da10efcd"},{"author":{"_account_id":3009,"name":"Vladimir Kozhukalov","email":"kozhukalov@gmail.com","username":"kozhukalov"},"change_message_id":"d60889917773545d47f0edf6388de479faf4a3dc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"f384aa0a_435fb44c","in_reply_to":"764b3af0_2facc17a","updated":"2025-01-28 15:11:07.000000000","message":"Here is the combination of two methods replacements and mounting snippets. https://github.com/kozhukalov/buzz3_chart","commit_id":"7fe001b0649e7136da068fcf79cd9ee7da10efcd"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"c44c570dd2ed957242c07f28bce66bede25c6dd6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"0e703a39_c40b9e45","in_reply_to":"77a19fcb_8c248259","updated":"2025-02-04 10:58:52.000000000","message":"Dough do I understood this correctly that you want to be able to define a snippet via helm chart values and mount it to the /etc/nova/nova.conf.d/nova-hidden.conf? For example:\n\n```\nconf:\n  nova-hidden.template:\n     oslo_database:\n       database_url: mysql://USERNAME@PASSWORD://.....\n```","commit_id":"7fe001b0649e7136da068fcf79cd9ee7da10efcd"},{"author":{"_account_id":3009,"name":"Vladimir Kozhukalov","email":"kozhukalov@gmail.com","username":"kozhukalov"},"change_message_id":"110ddd94475adee112521d8fe1ba0c3fa40e2fa7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"41d7d9d3_6c9e7532","in_reply_to":"df74c700_daaece08","updated":"2025-01-27 21:34:52.000000000","message":"Prepared another demo chart  https://github.com/kozhukalov/buzz2_chart . Please take a look and let me know if it looks better. \n\nBTW, for wsgi scripts it looks like we can not pass --config-file command line parameters when we use uwsgi.","commit_id":"7fe001b0649e7136da068fcf79cd9ee7da10efcd"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"ddfbe9c467bfee3a47d458e224243737fc1dd509","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"77a19fcb_8c248259","in_reply_to":"f384aa0a_435fb44c","updated":"2025-01-31 16:49:44.000000000","message":"This seems fine. It might be easier to just have a tmp dir mounted for each daemon and use --config-dir to that path and just dump the config files in there.","commit_id":"7fe001b0649e7136da068fcf79cd9ee7da10efcd"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"07792f6e3a3989ff84f6215f20bb1ec3f8efc643","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"cbdf33aa_f1e1ba45","in_reply_to":"f6690678_d515c1eb","updated":"2025-02-04 18:08:38.000000000","message":"No. I just want my file picked up. I\u0027ll drop it in /etc/nova/nova.conf.d/some-file.conf and I\u0027ll be responsible for formatting it.","commit_id":"7fe001b0649e7136da068fcf79cd9ee7da10efcd"}],"doc/source/specs/2025.1/consume_existing_creds_secrets.rst":[{"author":{"_account_id":6799,"name":"Nicholas Kuechler","email":"nkuechler@gmail.com","username":"nicholaskuechler"},"change_message_id":"d4205c5d71eaca3d0e889f0874ef086504bad838","unresolved":true,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    helm upgrade --install nova openstack-helm/nova --values custom.yaml"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"When the chart is rendered the conifig file will contain the bare values `REPLACE_USERNAME`"},{"line_number":68,"context_line":"and `REPLACE_PASSWORD` which are then replaced by the init container with the values taken"},{"line_number":69,"context_line":"from the credentials secret."},{"line_number":70,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"fcd7628b_26be424d","line":67,"updated":"2025-01-20 15:42:42.000000000","message":"Typo: \u0027conifig\u0027 should be \u0027config\u0027:\n\n```suggestion\nWhen the chart is rendered the config file will contain the bare values `REPLACE_USERNAME`\n```","commit_id":"730bafc7d1fe1c821a21a75efb0e519605382df5"},{"author":{"_account_id":3009,"name":"Vladimir Kozhukalov","email":"kozhukalov@gmail.com","username":"kozhukalov"},"change_message_id":"978d47fee39148bfae2741e448f5ff1858d0d2ba","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    helm upgrade --install nova openstack-helm/nova --values custom.yaml"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"When the chart is rendered the conifig file will contain the bare values `REPLACE_USERNAME`"},{"line_number":68,"context_line":"and `REPLACE_PASSWORD` which are then replaced by the init container with the values taken"},{"line_number":69,"context_line":"from the credentials secret."},{"line_number":70,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"1628765f_281580f5","line":67,"in_reply_to":"fcd7628b_26be424d","updated":"2025-01-20 18:22:00.000000000","message":"Acknowledged","commit_id":"730bafc7d1fe1c821a21a75efb0e519605382df5"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"da3cc0a7843a840fb4befbe64bb94868d5aac31a","unresolved":true,"context_lines":[{"line_number":144,"context_line":"                - |"},{"line_number":145,"context_line":"                  # Here we iterate over some config file templates and replace all the values"},{"line_number":146,"context_line":"                  # given in the .Values.replacementsSecret secret"},{"line_number":147,"context_line":"                  for conffile in foo.conf; do"},{"line_number":148,"context_line":"                    sed -f \u003c(kubectl get secret {{ .Values.replacementsSecret }} -o json | jq -r \u0027.data | keys[] as $key | \"s/\\($key)/\\(.[$key] | @base64d)/g\"\u0027) \\"},{"line_number":149,"context_line":"                        /etc/foo_templates/${conffile} \u003e /etc/foo/${conffile}"},{"line_number":150,"context_line":"                  done"},{"line_number":151,"context_line":"              volumeMounts:"},{"line_number":152,"context_line":"                - name: foo-etc-templates"}],"source_content_type":"text/x-rst","patch_set":3,"id":"c7747199_630ab056","line":149,"range":{"start_line":147,"start_character":0,"end_line":149,"end_character":77},"updated":"2025-01-21 08:34:18.000000000","message":"We can use downward API and mount secret data as env variables to avoid scalability issues during pod restarts, when all of them will query secrets. Also this will require granting secret get permissions for kubernetes service accounts which is not liken by security scanners.\n\nHow you are going to check for secret values changes and take a decision that restart of service is needed?","commit_id":"911d8a4c42e2f00681f5f5e18d16a96e056baeb4"},{"author":{"_account_id":3009,"name":"Vladimir Kozhukalov","email":"kozhukalov@gmail.com","username":"kozhukalov"},"change_message_id":"2b4c31be49b634b8d09ad855810384a0b33e83bc","unresolved":false,"context_lines":[{"line_number":144,"context_line":"                - |"},{"line_number":145,"context_line":"                  # Here we iterate over some config file templates and replace all the values"},{"line_number":146,"context_line":"                  # given in the .Values.replacementsSecret secret"},{"line_number":147,"context_line":"                  for conffile in foo.conf; do"},{"line_number":148,"context_line":"                    sed -f \u003c(kubectl get secret {{ .Values.replacementsSecret }} -o json | jq -r \u0027.data | keys[] as $key | \"s/\\($key)/\\(.[$key] | @base64d)/g\"\u0027) \\"},{"line_number":149,"context_line":"                        /etc/foo_templates/${conffile} \u003e /etc/foo/${conffile}"},{"line_number":150,"context_line":"                  done"},{"line_number":151,"context_line":"              volumeMounts:"},{"line_number":152,"context_line":"                - name: foo-etc-templates"}],"source_content_type":"text/x-rst","patch_set":3,"id":"084b6e95_339a180b","line":149,"range":{"start_line":147,"start_character":0,"end_line":149,"end_character":77},"in_reply_to":"4a3274ac_7d50e050","updated":"2025-02-04 09:17:59.000000000","message":"Done","commit_id":"911d8a4c42e2f00681f5f5e18d16a96e056baeb4"},{"author":{"_account_id":3009,"name":"Vladimir Kozhukalov","email":"kozhukalov@gmail.com","username":"kozhukalov"},"change_message_id":"869fa0982612efc561e8204311865ca1a874b784","unresolved":true,"context_lines":[{"line_number":144,"context_line":"                - |"},{"line_number":145,"context_line":"                  # Here we iterate over some config file templates and replace all the values"},{"line_number":146,"context_line":"                  # given in the .Values.replacementsSecret secret"},{"line_number":147,"context_line":"                  for conffile in foo.conf; do"},{"line_number":148,"context_line":"                    sed -f \u003c(kubectl get secret {{ .Values.replacementsSecret }} -o json | jq -r \u0027.data | keys[] as $key | \"s/\\($key)/\\(.[$key] | @base64d)/g\"\u0027) \\"},{"line_number":149,"context_line":"                        /etc/foo_templates/${conffile} \u003e /etc/foo/${conffile}"},{"line_number":150,"context_line":"                  done"},{"line_number":151,"context_line":"              volumeMounts:"},{"line_number":152,"context_line":"                - name: foo-etc-templates"}],"source_content_type":"text/x-rst","patch_set":3,"id":"4a3274ac_7d50e050","line":149,"range":{"start_line":147,"start_character":0,"end_line":149,"end_character":77},"in_reply_to":"c7747199_630ab056","updated":"2025-01-22 14:21:23.000000000","message":"Modified the spec. Added secret checksum annotation.","commit_id":"911d8a4c42e2f00681f5f5e18d16a96e056baeb4"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"da3cc0a7843a840fb4befbe64bb94868d5aac31a","unresolved":true,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":"Here is the `PoC chart`_ that demonstrates the proposed change."},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"Alternatively, we could implement a K8s operator that would track annotated secrets"},{"line_number":192,"context_line":"and prepare config files from templates. In this case the chart the kubernetes-entrypoint"},{"line_number":193,"context_line":"container must wait for the config files to be ready before starting the main container."},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"Documentation Impact"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1d7ce7d8_af096afe","line":192,"range":{"start_line":191,"start_character":0,"end_line":192,"end_character":41},"updated":"2025-01-21 08:34:18.000000000","message":"Another alternative is to use a wrapper controller around chart that prepare chart values and we do not need to store them in git repo. Since chart values are stored in kubernetes secrets by itself it is a safe way to use it. An example is https://github.com/Mirantis/rockoon","commit_id":"911d8a4c42e2f00681f5f5e18d16a96e056baeb4"},{"author":{"_account_id":3009,"name":"Vladimir Kozhukalov","email":"kozhukalov@gmail.com","username":"kozhukalov"},"change_message_id":"869fa0982612efc561e8204311865ca1a874b784","unresolved":true,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":"Here is the `PoC chart`_ that demonstrates the proposed change."},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"Alternatively, we could implement a K8s operator that would track annotated secrets"},{"line_number":192,"context_line":"and prepare config files from templates. In this case the chart the kubernetes-entrypoint"},{"line_number":193,"context_line":"container must wait for the config files to be ready before starting the main container."},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"Documentation Impact"}],"source_content_type":"text/x-rst","patch_set":3,"id":"5a704183_63e9b5e3","line":192,"range":{"start_line":191,"start_character":0,"end_line":192,"end_character":41},"in_reply_to":"1d7ce7d8_af096afe","updated":"2025-01-22 14:21:23.000000000","message":"Added this alternative.","commit_id":"911d8a4c42e2f00681f5f5e18d16a96e056baeb4"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"9c798e34bc194e686666f5a9a927de15695c31f5","unresolved":true,"context_lines":[{"line_number":194,"context_line":"                  readOnly: true"},{"line_number":195,"context_line":"          volumes:"},{"line_number":196,"context_line":"            {{- if .Values.replacementsSecret }}"},{"line_number":197,"context_line":"            # if .Values.replacementsSecret is given we mount config files as templates"},{"line_number":198,"context_line":"            # which are then handled by the init container to replace the values"},{"line_number":199,"context_line":"            - name: foo-etc-templates"},{"line_number":200,"context_line":"              secret:"},{"line_number":201,"context_line":"                secretName: foo-etc"},{"line_number":202,"context_line":"                defaultMode: 0444"},{"line_number":203,"context_line":"            - name: foo-etc"},{"line_number":204,"context_line":"              emptyDir: {}"},{"line_number":205,"context_line":"            {{- else }}"},{"line_number":206,"context_line":"            # if .Values.replacementsSecret is not given we consider config files"},{"line_number":207,"context_line":"            # are ready to be used by a service"},{"line_number":208,"context_line":"            - name: foo-etc"}],"source_content_type":"text/x-rst","patch_set":5,"id":"afea17c3_a9849bf2","line":205,"range":{"start_line":197,"start_character":0,"end_line":205,"end_character":23},"updated":"2025-02-03 14:20:31.000000000","message":"we will allow only one big secret with all secret variables or it will be possible to specify different secret names?","commit_id":"7fe001b0649e7136da068fcf79cd9ee7da10efcd"},{"author":{"_account_id":3009,"name":"Vladimir Kozhukalov","email":"kozhukalov@gmail.com","username":"kozhukalov"},"change_message_id":"2b4c31be49b634b8d09ad855810384a0b33e83bc","unresolved":true,"context_lines":[{"line_number":194,"context_line":"                  readOnly: true"},{"line_number":195,"context_line":"          volumes:"},{"line_number":196,"context_line":"            {{- if .Values.replacementsSecret }}"},{"line_number":197,"context_line":"            # if .Values.replacementsSecret is given we mount config files as templates"},{"line_number":198,"context_line":"            # which are then handled by the init container to replace the values"},{"line_number":199,"context_line":"            - name: foo-etc-templates"},{"line_number":200,"context_line":"              secret:"},{"line_number":201,"context_line":"                secretName: foo-etc"},{"line_number":202,"context_line":"                defaultMode: 0444"},{"line_number":203,"context_line":"            - name: foo-etc"},{"line_number":204,"context_line":"              emptyDir: {}"},{"line_number":205,"context_line":"            {{- else }}"},{"line_number":206,"context_line":"            # if .Values.replacementsSecret is not given we consider config files"},{"line_number":207,"context_line":"            # are ready to be used by a service"},{"line_number":208,"context_line":"            - name: foo-etc"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3d5a86e2_2c2d41af","line":205,"range":{"start_line":197,"start_character":0,"end_line":205,"end_character":23},"in_reply_to":"afea17c3_a9849bf2","updated":"2025-02-04 09:17:59.000000000","message":"The spec currently suggests using one or two (one for replacements and one for snippets) secrets per chart. This is gonna be easy to maintain.","commit_id":"7fe001b0649e7136da068fcf79cd9ee7da10efcd"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"9c798e34bc194e686666f5a9a927de15695c31f5","unresolved":true,"context_lines":[{"line_number":67,"context_line":".. code-block:: yaml"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    replacementsSecret: extra"},{"line_number":70,"context_line":"    replacementsKeys:"},{"line_number":71,"context_line":"      - REPLACE_USERNAME"},{"line_number":72,"context_line":"      - REPLACE_PASSWORD"},{"line_number":73,"context_line":"    snippetsSecret: extra"},{"line_number":74,"context_line":"    snippetsSecretMounts:"},{"line_number":75,"context_line":"      foo:"}],"source_content_type":"text/x-rst","patch_set":6,"id":"63b11f7c_b4f8e8f6","line":72,"range":{"start_line":70,"start_character":0,"end_line":72,"end_character":24},"updated":"2025-02-03 14:20:31.000000000","message":"I\u0027m thinking now on the following alternative. We mount secret with overrides as a directory into /etc/\u003cservice\u003e/overrides/. Each secret entry will be presented as file with specified content so later we can walk over all files in the directory and subsitute \u003cfilename\u003e/\u003cfilename value\u003e via sed. By doing this user will not need to set exact list of keys in values, and only secret name for substitution should be provided. Also I wondered if we would like to keep all values in single secret or allow to use more than one secret with substitution.\n\nMaybe keep all data related to replacement secrets under specific key, for example\n```\nreplacementsSecret|replacementSecrets:\n    name: extra\n    replacementsKeys:\n      - REPLACE_USERNAME\n      - REPLACE_PASSWORD\n    snippetsSecret: extra\n    snippetsSecretMounts:\n      foo:\n        key: sensitive.conf\n        path: /etc/foo/sensitive.conf\n```\nor\n\n```\nreplacementSecrets:\n  \u003csecret_name\u003e:\n    checksumm: \u003cxxxx\u003e\n```","commit_id":"7cccc03e34be83d5d15c81022f1e4ceeceb6c9b1"},{"author":{"_account_id":3009,"name":"Vladimir Kozhukalov","email":"kozhukalov@gmail.com","username":"kozhukalov"},"change_message_id":"2b4c31be49b634b8d09ad855810384a0b33e83bc","unresolved":true,"context_lines":[{"line_number":67,"context_line":".. code-block:: yaml"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    replacementsSecret: extra"},{"line_number":70,"context_line":"    replacementsKeys:"},{"line_number":71,"context_line":"      - REPLACE_USERNAME"},{"line_number":72,"context_line":"      - REPLACE_PASSWORD"},{"line_number":73,"context_line":"    snippetsSecret: extra"},{"line_number":74,"context_line":"    snippetsSecretMounts:"},{"line_number":75,"context_line":"      foo:"}],"source_content_type":"text/x-rst","patch_set":6,"id":"6f69fadb_40e3fc4e","line":72,"range":{"start_line":70,"start_character":0,"end_line":72,"end_character":24},"in_reply_to":"63b11f7c_b4f8e8f6","updated":"2025-02-04 09:17:59.000000000","message":"\u003e checksumm: \u003cxxxx\u003e\nIt is gonna impose additional burden for deployers to calculate the checksum of the secret and put it to values explicitly","commit_id":"7cccc03e34be83d5d15c81022f1e4ceeceb6c9b1"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"baa666973ef20facff9075f611f912f7547bc27e","unresolved":true,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":".. code-block:: yaml"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    replacementsSecret: replacements"},{"line_number":78,"context_line":"    snippetsSecret: snippets"},{"line_number":79,"context_line":"    snippetsMounts:"},{"line_number":80,"context_line":"      foo:"}],"source_content_type":"text/x-rst","patch_set":8,"id":"f4a00e30_9740527f","line":77,"range":{"start_line":77,"start_character":4,"end_line":77,"end_character":36},"updated":"2025-02-06 08:43:11.000000000","message":"better to have nested strucuture here and keep everyting related to replacement under `replacement` key.\n\n```\nreplacemenet_secret:\n  name: ...\n```","commit_id":"375bde2bf6edf5190b93ecdf302a4f80ab67e5b3"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"baa666973ef20facff9075f611f912f7547bc27e","unresolved":true,"context_lines":[{"line_number":75,"context_line":".. code-block:: yaml"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    replacementsSecret: replacements"},{"line_number":78,"context_line":"    snippetsSecret: snippets"},{"line_number":79,"context_line":"    snippetsMounts:"},{"line_number":80,"context_line":"      foo:"},{"line_number":81,"context_line":"        key: snippet.conf"},{"line_number":82,"context_line":"        path: /etc/foo/snippet.conf"},{"line_number":83,"context_line":"    endpoints:"},{"line_number":84,"context_line":"      oslo_db:"},{"line_number":85,"context_line":"        auth:"}],"source_content_type":"text/x-rst","patch_set":8,"id":"1cac1fb8_30cba1e4","line":82,"range":{"start_line":78,"start_character":0,"end_line":82,"end_character":35},"updated":"2025-02-06 08:43:11.000000000","message":"I would use nested structure for data storage here, and keep naming patters similar to what we have, use _ in values not upper score letter.\n\n```\nsnippets:\n  secret_name:\n  mounts:\n    ..\n```\n\nHow is this differ from what we allow mounting right now, for example to nova?\nhttps://github.com/openstack/openstack-helm/blob/master/nova/templates/daemonset-compute.yaml#L66C71-L66C73\n\n@cardoe@cardoe.com: do you think another way of mounting custom files is really needed?","commit_id":"375bde2bf6edf5190b93ecdf302a4f80ab67e5b3"}]}
