Prebuild /etc/passwd and /etc/group if possible

Motivation for this change
When mutableUsers = false and all users and groups have assigned UID/GIDs, we can precompute exactly what update-users-groups.pl would output for /etc/passwd and /etc/group. In those cases we don't need to run it at activation time; we can generate the right files at build time and just symlink them into place.
These patches make that happen automatically when it's safe to do so. Until #64268 gets merged most NixOS configurations won't see any benefit because nscd doesn't have an assigned UID, but you can always manually assign UIDs and GIDs as needed to make these changes trigger. In my testing I just disabled nscd instead.
The first few commits are just cleanups that I think are worth applying regardless. In particular, "no output for empty snippets" just makes the generated activation script easier to read. Since the snippets I introduce in later commits are empty under various circumstances, it's nice to have that cleanup in place first.
I didn't do this because of closure size, but it does reduce the closure size for my test configurations by more than I expected: 187kB savings if no users have password or passwordFile set. If any users do have one of those options, that adds 32kB to pull in mkpasswd, which is still a 155kB savings. Of course, that's all rounding errors in these 539MB closures...
Hey @peterhoeg and @arianvp, you seemed interested in this work, so here's the pull request I promised.
Things done

[x] Tested using sandboxing (nix.useSandbox on NixOS, or option sandbox in nix.conf on non-NixOS)
Built on platform(s)

[x] NixOS
[ ] macOS
[ ] other Linux distributions

[x] Tested via one or more NixOS test(s) if existing and applicable for the change (look inside nixos/tests)
[ ] Tested compilation of all pkgs that depend on this change using nix-shell -p nix-review --run "nix-review wip"
[ ] Tested execution of all binary files (usually in ./result/bin/)
[x] Determined the impact on package closure size (by running nix path-info -S before and after)
[ ] Ensured that relevant documentation is up to date
[x] Fits CONTRIBUTING.md.

After opening this PR I discovered that:

I misunderstood the passwordFile option and over-complicated how I implemented it;
I needed to take additional steps to get nscd to reload its caches when using this mode;
and the steps that update-users-groups.pl took to get nscd to reload its caches are not necessary.

I've force-pushed fixes for these issues.

Also my commit 6bab2aef337b23b3c0b9f08f774fb48c63d242b4, "just symlink subuid/subgid", broke tests.login. I think the existing implementation is broken and the tests aren't checking the right thing, but since that's a separate issue I've opened #64606 and dropped this patch from this series.

I need to go through this in detail in order to be able to say anything sensible about it.

These patches make that happen automatically when it's safe to do so. Until #64268 gets merged most NixOS configurations won't see any benefit because nscd doesn't have an assigned UID, but you can always manually assign UIDs and GIDs as needed to make these changes trigger. In my testing I just disabled nscd instead.

@jameysharp this sentence I don't fully understand what you mean here. Could you go into a bit more detail what nscd has to do with this?

@arianvp, sure, happy to. Here's the problematic bit in current master: https://github.com/NixOS/nixpkgs/blob/215497e1e828108b87437822476f0da1fab0c934/nixos/modules/services/system/nscd.nix#L42-L45
Because this users.users.nscd declaration doesn't specify uid, the only way to ensure that the allocated UID remains stable on a given NixOS installation is to use update-users-groups.pl to check if a UID has previously been assigned to that user on that installation, and only allocate a new UID if it hasn't been set yet.
This PR detects that case, where at least one user has uid == null, and falls back to the existing update-users-groups.pl strategy to handle it. There are two ways to get this PR to work with the existing definition for nscd: either manually pick a UID and assign it to users.users.nscd.uid in your configuration, or set services.nscd.enable = false. Of course the latter option has bad consequences for most NixOS installations.
My other PR takes advantage of the fact that nscd does not need a stable UID, and deletes the user definition entirely, which of course is another way to allow this PR to work.
Question: Do I need to document the constraints on when static passwd/group are possible, since that doesn't seem to have been clear? If so, where?

This looks like a nice change!

Question: Do I need to document the constraints on when static passwd/group are possible, since that doesn't seem to have been clear? If so, where?

I'd like an option that acts as an accountsAreDeterministic assertion to catch when you've unknowingly enabled a service that makes them nondeterministic. Default to false of course, and would double as a good place to document this feature? Alternatively just expose it as an readonly output option where the default is calculated from the config. (then the user can assert if they want to, or maybe this is too weird but: make it pseudo-readonly so if it's set by user configuration and reality differs from the expectations implied by setting/mkForcing it, assert fail)
So, I wonder how this change interacts with ID scarcity and @Infinisil's recent conclusion that static IDs should stop being assigned entirely. I know I've encountered services that do not have IDs assigned that I've manually done so for the purpose of having stable IDs for mutable data in /var/lib/etc, though wasn't sure whether to report it as the warning in ids.nix gave me pause.
I'm not sure if I have a personal opinion on this (maybe stable IDs are important or maybe IDs should just be a system-local implementation detail) but I will say avoiding activation scripts is always a fantastic benefit. It seems unfortunate if taking advantage of this PR will boil down to "you'll just have to maintain your own static id map" but maybe that's the best that can be done without reserving a bigger range for everything (in which case there should probably be a well-documented way/range to do this?)

Yeah so as described in the issue, we don't have many static ips left in the normal range (below 400), and NixOS has had good support for non-static uid's for some time now. So I'd like for NixOS to move to what I describe in https://github.com/NixOS/nixpkgs/issues/60732#issuecomment-513242543, dynamic uid's for all future services.
And regarding this PR, even if we ignore that issue, the benefits of it (<1MB less closure size only if all users have a static uid) just don't outweigh the costs (complicating user management code a lot).

So I'd like for NixOS to move to what I describe in #60732 (comment), dynamic uid's for all future services.

If we want IDs to be transient I think it's worth considering moving to systemd's DynamicUser instead, and mostly alleviate NixOS scripts of the responsibility of managing ids - which also happens to be a solution that makes this PR viable with dynamic IDs.

the benefits of it (<1MB less closure size only if all users have a static uid) just don't outweigh the costs (complicating user management code a lot).

I'd argue the benefits come more from immutability, reducing impure activation script logic, and not having to maintain local system state rather than the impact on closure size. Moving the user management logic to build time feels more like a reduction of complexity; unfortunately having to support mutableUsers and backward compatibility makes that point moot. It's also maybe worth noting that the actual closure size impact could be more like 50MB if one were able to remove perl from the system, though that is a bit of a pipe dream.

Yeah I also just replied in https://github.com/NixOS/nixpkgs/issues/60732#issuecomment-515714484, I also very much prefer DynamicUser if it's applicable.
The reduction in complexity would be nice yeah, but unfortunately there's no way this is going to happen, because as you said we can't just remove support for mutableUsers.

Oh no! I'm super discouraged to hear this. NixOS is so close to being usable as a static disk image builder; please don't do things that make it harder to use it that way. For my use cases I don't see any way to use NixOS if I can't configure out usage of the update-users-groups script. My current approach is to just skip running any activation scripts and kludge enough things back into place that my specific configuration can boot, but I really hoped to get enough things upstream to be able to quit doing that.
For what it's worth, the proof of concept configuration I have here actually doesn't have Perl (or Python, or Ruby, or node.js) in its closure. Together with things like this PR, a lot of the current Perl-scripted boot process can be replaced with stuff that systemd has built-in. So I don't think it's a pipe dream at all.
@arcnmx, I like your suggestion of an option that triggers an assertion if the files can't be statically generated. That raises the question of whether the auto-detection should still happen if both mutableUsers and the new option are false, or if the only way to turn on this behavior would be by enabling the new option. Of course, all that is irrelevant if this PR is rejected, so I'm not going to think about it too hard yet.

Ah, you didn't mention anything about wanting to use this for static disk images before. I've never done anything with those, but I assume the point is that you can do something like mount the whole thing ro and have it work like that? That is a much better benefit for this than just the tiny closure size decrease.
So your intention is to rid your NixOS of activationScripts and replace them all with things that can be set up statically (like systemd.tmpfiles?). And the users is one thing that can't work like that due to it being dynamic, unless you make all users have a static uid (the same for groups). That right?

Oh, I guess I've only mentioned that in some of my other recent pull requests, you're right.
 I used a much simpler version of this patch for my proof of concept–I didn't care about passwords, which cause most of the complexity here–and for my purposes I didn't need any of the other activation scripts to make my read-only squashfs root file system image work.
I have gotten several other activation scripts replaced on master already though–yes, usually with tmpfiles.d, but I've worked out a number of tricks with one-shot units or ExecStartPre for more complex cases–and I have a pile of additional patches which are waiting for me to organize them into reviewable pull requests: https://github.com/jameysharp/nixpkgs/tree/deactivation

Okay so I think I'd be alright with this if you made it with such an option like staticIds which when enabled will enforce static uid/gid's for all users/groups and do this static /etc/{passwd,groups} setup (and doesn't do it if it's disabled, to make it more predictable).

Done! Your proposal is better for my purposes since it means that a configuration intended for a read-only filesystem can turn on these asserts, rather than hoping the auto-detection triggers.
I named the option users.enforceStaticIds for some consistency with the existing users.enforceIdUniqueness option.
I also tested on both my branch, which is already almost 2000 commits behind master, as well as after merging master into my branch. So I think this is safe to merge despite the amount of churn it's missed.

Cool, I think a code review is still needed though. I'm out of time for now but I'll ask myself for one.

Once upon a time mutableUsers = false implied that you had to provide static ID assignments, but we got rid of that and switched to doing dynamic ID allocations via update-users-groups.pl (1a75958be52f5c2f062ace0935c1a2d43c8f7f55). The reasons were that

Users shouldn't be required to manually manage ID assignments (just like you don't have to manage inode numbers).
Static ID assignments are not compositional (there is no way to prevent out-of-tree NixOS modules from clashing with each other).
We have only one code path to handle the mutableUsers = false and mutableUsers = true cases.

So bringing back fully static generation feels a bit like a step back to me.

@edolstra Okay, I understand those reasons, but do you have alternative suggestions for booting off a read-only filesystem?

@jameysharp Maybe put /etc on a tmpfs (or symlink it to /run/etc)? Then passwd and group will be regenerated by the activation script at boot time.

I'd need update-users-groups to not be written in Perl or the closure size will be too big for my use cases, but that can be a separate issue.
I was thinking about a compromise, like making /etc/passwd and the rest be symlinks to someplace in /var, but it turns out that the shadow suite opens those files with O_NOFOLLOW, so that doesn't work. Unless we rebuild pkgs.shadow with -DPASSWD_FILE=/var/... and so on, which I guess might not be the worst thing ever.
I'm still not real happy with this option since it requires some activation scripts, which are otherwise entirely unnecessary for my purposes. On a read-only system with a tmpfs on /var, which is a common situation for embedded Linux systems, everything that activation scripts or phase-2 init currently do can be done without them.
So I'm not sure where to go from here.

I guess it's fair to say that nixos wasn't meant or designed to build immutable systems - there are a number of problematic areas beyond just what this PR targets. I may disagree with a few points made here against it, but understandably the main concern here is the increased maintenance burden for an admittedly niche use-case. It just feels unfortunate since it seems like it could get very close to being usable as a replacement for yocto/etc...

So I'm not sure where to go from here.

I suppose it mostly comes down to going with a fork or heavy customization approach as the alternative, and hoping the least intrusive changes can still be upstreamed? mkForce or selective imports can be somewhat flexible tools I guess ><

Yeah, okay, apparently I can create an out-of-tree module that sets system.activationScripts.users = lib.mkForce "" and then does what this PR does in lieu of the default behavior.
Is there a better way to let an out-of-tree module hook into this process, rather than using mkForce?
I think these commits are still worth merging as general cleanups to activation-script.nix:

a3180b5fc34a68aac245533b2ab52549148c0634
04da25cd20da2a9aea032e57eb80648e55de8cc6

And these are general cleanups to update-users-groups.pl:

4985e7908f94abed053480c4ee3dffbee301069c
4c141b3594cc17c7d6b24201118e0a3e108e0bc9

I also have a pile of other cleanups on my https://github.com/jameysharp/nixpkgs/commits/deactivation branch, which don't have much to do with each other aside from eliminating various activation scripts. Should I pile everything that's ready into one new PR, or try to group them vaguely logically?

I think these commits are still worth merging as general cleanups
I had a look at those 4 and they should definitely go in. Any chance you could wrap them up in a separate PR?


Decimal zeros missing after division

Description
When dividing one base-10 number by another base-10 number, if the result number has any zeros in the decimal part, they don't appear in the num array for some reason.
For example, dividing number 2.202 (num:[2,2,0,2],dec:3,pol:1,base:10) by 2.0 (num:[2,0],dec:1,pol:1,base:10) results in a number 1.11 and not 1.101.
Screenshots

2.202 / 2.0 is 1.101, while the other digits are correct, zeros appear to be missing

3.141592 / 2.0 is 1.570796
How to reproduce

Create a new minecraft world with the datapack
Call arr_math:setup
Run /data modify storage arr_math:in var1 set value {dec:3,num:[2,2,0,2],pol:1,base:10}
Run /data modify storage arr_math:in var2 set value {dec:1,num:[2,0],pol:1,base:10}
Call arr_math:divide
Run /data get storage arr_math:main out

I know the work on the pack might be discontinued, but I'm really hoping for a fix, because otherwise the pack is a treasure :>

Also, surprisingly, this issue appears to be not present when the resulting number has two or more zeros in a row. That way, dividing 2.2002 by 2 results in a proper 1.1001, while 2.202 / 2 is still 1.11

interesting, I'll have to look into it, it might be trimming 0's a bit too much


grad_norm is 0

Hello, I found that the gradient is 0 during training.

Always 0? That has never happened in my training. Did you change something?

Feel free to re-open if there are any updates.


TEF v4.0.0 retrofit/rebase before modifications for a Canadian Public Sector Landing Zone reference in Terraform

We will merge work being done in forks into this repo for use by and collaboration with multiple client organizations - where the bulk of customization, automation, retrofitting and additions are done in public
branch: https://github.com/GoogleCloudPlatform/pbmm-on-gcp-onboarding/tree/gh357-tef-v4-fork
The base repo is the 20240405 4.0 release version of
The goal is to both upsource PRs back to the TEF as we go - and rebase from the TEF as we complete phase one over the next 4-6 weeks.
https://github.com/terraform-google-modules/terraform-example-foundation
https://github.com/terraform-google-modules/terraform-example-foundation/releases/tag/v4.0.0

Your branch is up to date with 'origin/gh357-tef-v4-fork'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   .gitignore
	new file:   0-bootstrap/.gitignore
	new file:   0-bootstrap/Dockerfile
	new file:   0-bootstrap/README-GitHub.md
	new file:   0-bootstrap/README-GitLab.md
	new file:   0-bootstrap/README-Jenkins.md
	new file:   0-bootstrap/README-Terraform-Cloud.md
	new file:   0-bootstrap/README.md
	new file:   0-bootstrap/backend.tf.cloud.example
	new file:   0-bootstrap/backend.tf.example
	new file:   0-bootstrap/cb.tf
	new file:   0-bootstrap/files/private_key_example.png
	new file:   0-bootstrap/github.tf.example
	new file:   0-bootstrap/gitlab.tf.example
	new file:   0-bootstrap/groups.tf
	new file:   0-bootstrap/jenkins.tf.example
	new file:   0-bootstrap/main.tf
	new file:   0-bootstrap/modules/cb-private-pool/README.md
	new file:   0-bootstrap/modules/cb-private-pool/main.tf
	new file:   0-bootstrap/modules/cb-private-pool/network.tf
	new file:   0-bootstrap/modules/cb-private-pool/outputs.tf
	new file:   0-bootstrap/modules/cb-private-pool/variables.tf
	new file:   0-bootstrap/modules/cb-private-pool/versions.tf
	new file:   0-bootstrap/modules/cb-private-pool/vpn_ha.tf
	new file:   0-bootstrap/modules/gitlab-oidc/main.tf
	new file:   0-bootstrap/modules/gitlab-oidc/outputs.tf
	new file:   0-bootstrap/modules/gitlab-oidc/variables.tf
	renamed:    2023_technical_onboarding_center/20-partner-interconnect/settings.tfvars -> 0-bootstrap/modules/gitlab-oidc/versions.tf
	new file:   0-bootstrap/modules/jenkins-agent/README.md
	new file:   0-bootstrap/modules/jenkins-agent/files/jenkins_gce_startup_script.sh
	new file:   0-bootstrap/modules/jenkins-agent/main.tf
	new file:   0-bootstrap/modules/jenkins-agent/outputs.tf
	new file:   0-bootstrap/modules/jenkins-agent/variables.tf
	new file:   0-bootstrap/modules/jenkins-agent/versions.tf
	new file:   0-bootstrap/modules/jenkins-agent/vpn_ha.tf
	new file:   0-bootstrap/modules/parent-iam-member/main.tf
	new file:   0-bootstrap/modules/parent-iam-member/variables.tf
	new file:   0-bootstrap/modules/parent-iam-member/versions.tf
	new file:   0-bootstrap/modules/parent-iam-remove-role/main.tf
	new file:   0-bootstrap/modules/parent-iam-remove-role/variables.tf
	new file:   0-bootstrap/modules/parent-iam-remove-role/versions.tf
	new file:   0-bootstrap/modules/tfc-agent-gke/README.md
	new file:   0-bootstrap/modules/tfc-agent-gke/main.tf
	new file:   0-bootstrap/modules/tfc-agent-gke/outputs.tf
	new file:   0-bootstrap/modules/tfc-agent-gke/variables.tf
	new file:   0-bootstrap/modules/tfc-agent-gke/versions.tf
	new file:   0-bootstrap/onprem.md
	new file:   0-bootstrap/outputs.tf
	new file:   0-bootstrap/provider.tf
	new file:   0-bootstrap/sa.tf
	new file:   0-bootstrap/scripts/git_create_branches_helper.sh
	new file:   0-bootstrap/scripts/push-to-repo.sh
	new file:   0-bootstrap/terraform_cloud.tf.example
	new file:   0-bootstrap/variables.tf
	new file:   0-bootstrap/versions.tf
	new file:   1-org/.gitignore
	new file:   1-org/README.md
	new file:   1-org/envs/shared/README.md
	new file:   1-org/envs/shared/backend.tf
	new file:   1-org/envs/shared/backend.tf.cloud.example
	new file:   1-org/envs/shared/cai_monitoring.tf
	new file:   1-org/envs/shared/essential_contacts.tf
	new file:   1-org/envs/shared/folders.tf
	new file:   1-org/envs/shared/iam.tf
	new file:   1-org/envs/shared/log_sinks.tf
	new file:   1-org/envs/shared/org_policy.tf
	new file:   1-org/envs/shared/outputs.tf
	new file:   1-org/envs/shared/projects.tf
	new file:   1-org/envs/shared/providers.tf
	new file:   1-org/envs/shared/remote.tf
	new file:   1-org/envs/shared/remote.tf.cloud.example
	new file:   1-org/envs/shared/scc_notification.tf
	new file:   1-org/envs/shared/tags.tf
	new file:   1-org/envs/shared/variables.tf
	new file:   1-org/envs/shared/versions.tf
	new file:   1-org/modules/cai-monitoring/README.md
	new file:   1-org/modules/cai-monitoring/function-source/index.js
	new file:   1-org/modules/cai-monitoring/function-source/package-lock.json
	new file:   1-org/modules/cai-monitoring/function-source/package.json
	new file:   1-org/modules/cai-monitoring/iam.tf
	new file:   1-org/modules/cai-monitoring/main.tf
	new file:   1-org/modules/cai-monitoring/outputs.tf
	new file:   1-org/modules/cai-monitoring/providers.tf
	new file:   1-org/modules/cai-monitoring/variables.tf
	new file:   1-org/modules/cai-monitoring/versions.tf
	new file:   1-org/modules/centralized-logging/README.md
	new file:   1-org/modules/centralized-logging/main.tf
	new file:   1-org/modules/centralized-logging/outputs.tf
	new file:   1-org/modules/centralized-logging/variables.tf
	new file:   1-org/modules/centralized-logging/versions.tf
	new file:   1-org/modules/network/main.tf
	new file:   1-org/modules/network/outputs.tf
	new file:   1-org/modules/network/variables.tf
	new file:   1-org/modules/network/versions.tf
	new file:   2-environments/.gitignore
	new file:   2-environments/README.md
	new file:   2-environments/envs/development/README.md
	new file:   2-environments/envs/development/backend.tf
	new file:   2-environments/envs/development/backend.tf.cloud.example
	new file:   2-environments/envs/development/main.tf
	new file:   2-environments/envs/development/outputs.tf
	new file:   2-environments/envs/development/variables.tf
	new file:   2-environments/envs/non-production/README.md
	new file:   2-environments/envs/non-production/backend.tf
	new file:   2-environments/envs/non-production/backend.tf.cloud.example
	new file:   2-environments/envs/non-production/main.tf
	new file:   2-environments/envs/non-production/outputs.tf
	new file:   2-environments/envs/non-production/variables.tf
	new file:   2-environments/envs/production/README.md
	new file:   2-environments/envs/production/backend.tf
	new file:   2-environments/envs/production/backend.tf.cloud.example
	new file:   2-environments/envs/production/main.tf
	new file:   2-environments/envs/production/outputs.tf
	new file:   2-environments/envs/production/variables.tf
	new file:   2-environments/modules/env_baseline/README.md
	new file:   2-environments/modules/env_baseline/assured_workload.tf
	new file:   2-environments/modules/env_baseline/folders.tf
	new file:   2-environments/modules/env_baseline/iam.tf
	new file:   2-environments/modules/env_baseline/kms.tf
	new file:   2-environments/modules/env_baseline/monitoring.tf
	new file:   2-environments/modules/env_baseline/outputs.tf
	new file:   2-environments/modules/env_baseline/remote.tf
	new file:   2-environments/modules/env_baseline/remote.tf.cloud.example
	new file:   2-environments/modules/env_baseline/secrets.tf
	new file:   2-environments/modules/env_baseline/variables.tf
	new file:   2-environments/modules/env_baseline/versions.tf
	deleted:    2024_fortigate-accelerator/terraform/day0/terraform.tfvars
	new file:   2024_v020_pre_tef_v4/.gitignore
	renamed:    2022_archive_v1/README.md -> 2024_v020_pre_tef_v4/2022_archive_v1/README.md
	renamed:    2023_cloud_foundation_fabric/README.md -> 2024_v020_pre_tef_v4/2023_cloud_foundation_fabric/README.md
	renamed:    2023_cloud_foundation_toolkit/README.md -> 2024_v020_pre_tef_v4/2023_cloud_foundation_toolkit/README.md
	renamed:    2023_technical_onboarding_center/20-partner-interconnect/main.tf -> 2024_v020_pre_tef_v4/2023_technical_onboarding_center/20-partner-interconnect/main.tf
	renamed:    2023_technical_onboarding_center/20-partner-interconnect/outputs.tf -> 2024_v020_pre_tef_v4/2023_technical_onboarding_center/20-partner-interconnect/outputs.tf
	renamed:    2023_technical_onboarding_center/20-partner-interconnect/variables.tf -> 2024_v020_pre_tef_v4/2023_technical_onboarding_center/20-partner-interconnect/variables.tf
	renamed:    2023_technical_onboarding_center/8-deploy-or-download/README.md -> 2024_v020_pre_tef_v4/2023_technical_onboarding_center/8-deploy-or-download/README.md
	renamed:    2023_technical_onboarding_center/8-deploy-or-download/folders.tf -> 2024_v020_pre_tef_v4/2023_technical_onboarding_center/8-deploy-or-download/folders.tf
	renamed:    2023_technical_onboarding_center/8-deploy-or-download/iam.tf -> 2024_v020_pre_tef_v4/2023_technical_onboarding_center/8-deploy-or-download/iam.tf
	renamed:    2023_technical_onboarding_center/8-deploy-or-download/log-export.tf -> 2024_v020_pre_tef_v4/2023_technical_onboarding_center/8-deploy-or-download/log-export.tf
	renamed:    2023_technical_onboarding_center/8-deploy-or-download/network.tf -> 2024_v020_pre_tef_v4/2023_technical_onboarding_center/8-deploy-or-download/network.tf
	renamed:    2023_technical_onboarding_center/8-deploy-or-download/projects.tf -> 2024_v020_pre_tef_v4/2023_technical_onboarding_center/8-deploy-or-download/projects.tf
	renamed:    2023_technical_onboarding_center/8-deploy-or-download/variables.tf -> 2024_v020_pre_tef_v4/2023_technical_onboarding_center/8-deploy-or-download/variables.tf
	renamed:    2023_technical_onboarding_center/8-deploy-or-download/versions.tf -> 2024_v020_pre_tef_v4/2023_technical_onboarding_center/8-deploy-or-download/versions.tf
	renamed:    2023_technical_onboarding_center/README.md -> 2024_v020_pre_tef_v4/2023_technical_onboarding_center/README.md
	renamed:    2023_technical_onboarding_center/img/gcp_dual_interconnect_diagram.png -> 2024_v020_pre_tef_v4/2023_technical_onboarding_center/img/gcp_dual_interconnect_diagram.png
	renamed:    2023_terraform_example_foundation_v3/README.md -> 2024_v020_pre_tef_v4/2023_terraform_example_foundation_v3/README.md
	renamed:    2024_fortigate-accelerator/README-fortigate-tutorial-gcp.md -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/README-fortigate-tutorial-gcp.md
	renamed:    2024_fortigate-accelerator/README.md -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/README.md
	renamed:    2024_fortigate-accelerator/service_account_create.sh -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/service_account_create.sh
	renamed:    2024_fortigate-accelerator/terraform/README.md -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/terraform/README.md
	renamed:    2024_fortigate-accelerator/terraform/day0/README.md -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/terraform/day0/README.md
	renamed:    2024_fortigate-accelerator/terraform/day0/main.tf -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/terraform/day0/main.tf
	renamed:    2024_fortigate-accelerator/terraform/day0/outputs.tf -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/terraform/day0/outputs.tf
	renamed:    2024_fortigate-accelerator/terraform/day0/variables.tf -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/terraform/day0/variables.tf
	renamed:    2024_fortigate-accelerator/terraform/day1/README.md -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/terraform/day1/README.md
	renamed:    2024_fortigate-accelerator/terraform/day1/day0-import.tf -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/terraform/day1/day0-import.tf
	renamed:    2024_fortigate-accelerator/terraform/day1/main.tf -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/terraform/day1/main.tf
	renamed:    2024_fortigate-accelerator/terraform/day1/variables.tf -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/terraform/day1/variables.tf
	renamed:    2024_fortigate-accelerator/terraform/day1/versions.tf -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/terraform/day1/versions.tf
	renamed:    2024_fortigate-accelerator/terraform/day1/workloads.tf -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/terraform/day1/workloads.tf
	renamed:    2024_fortigate-accelerator/terraform/modules/fgcp-ha-ap-lb/README.md -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/terraform/modules/fgcp-ha-ap-lb/README.md
	renamed:    2024_fortigate-accelerator/terraform/modules/fgcp-ha-ap-lb/addresses.tf -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/terraform/modules/fgcp-ha-ap-lb/addresses.tf
	renamed:    2024_fortigate-accelerator/terraform/modules/fgcp-ha-ap-lb/fgt-base-config.tpl -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/terraform/modules/fgcp-ha-ap-lb/fgt-base-config.tpl
	renamed:    2024_fortigate-accelerator/terraform/modules/fgcp-ha-ap-lb/main.tf -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/terraform/modules/fgcp-ha-ap-lb/main.tf
	renamed:    2024_fortigate-accelerator/terraform/modules/fgcp-ha-ap-lb/outputs.tf -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/terraform/modules/fgcp-ha-ap-lb/outputs.tf
	renamed:    2024_fortigate-accelerator/terraform/modules/fgcp-ha-ap-lb/variables.tf -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/terraform/modules/fgcp-ha-ap-lb/variables.tf
	renamed:    2024_fortigate-accelerator/terraform/modules/sample-networks/main.tf -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/terraform/modules/sample-networks/main.tf
	renamed:    2024_fortigate-accelerator/terraform/modules/sample-networks/variables.tf -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/terraform/modules/sample-networks/variables.tf
	renamed:    2024_fortigate-accelerator/terraform/modules/usecases/inbound-ns/README.md -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/terraform/modules/usecases/inbound-ns/README.md
	renamed:    2024_fortigate-accelerator/terraform/modules/usecases/inbound-ns/main.tf -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/terraform/modules/usecases/inbound-ns/main.tf
	renamed:    2024_fortigate-accelerator/terraform/modules/usecases/inbound-ns/outputs.tf -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/terraform/modules/usecases/inbound-ns/outputs.tf
	renamed:    2024_fortigate-accelerator/terraform/modules/usecases/inbound-ns/variables.tf -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/terraform/modules/usecases/inbound-ns/variables.tf
	renamed:    2024_fortigate-accelerator/terraform/modules/usecases/inbound-ns/versions.tf -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/terraform/modules/usecases/inbound-ns/versions.tf
	renamed:    2024_fortigate-accelerator/terraform/modules/usecases/outbound-ns/README.md -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/terraform/modules/usecases/outbound-ns/README.md
	renamed:    2024_fortigate-accelerator/terraform/modules/usecases/outbound-ns/main.tf -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/terraform/modules/usecases/outbound-ns/main.tf
	renamed:    2024_fortigate-accelerator/terraform/modules/usecases/outbound-ns/variables.tf -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/terraform/modules/usecases/outbound-ns/variables.tf
	renamed:    2024_fortigate-accelerator/terraform/modules/usecases/outbound-ns/versions.tf -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/terraform/modules/usecases/outbound-ns/versions.tf
	renamed:    2024_fortigate-accelerator/terraform/modules/usecases/spoke-vpc/README.md -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/terraform/modules/usecases/spoke-vpc/README.md
	renamed:    2024_fortigate-accelerator/terraform/modules/usecases/spoke-vpc/main.tf -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/terraform/modules/usecases/spoke-vpc/main.tf
	renamed:    2024_fortigate-accelerator/terraform/modules/usecases/spoke-vpc/variables.tf -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/terraform/modules/usecases/spoke-vpc/variables.tf
	renamed:    2024_fortigate-accelerator/terraform/modules/usecases/spoke-vpc/versions.tf -> 2024_v020_pre_tef_v4/2024_fortigate-accelerator/terraform/modules/usecases/spoke-vpc/versions.tf
	new file:   3-networks-dual-svpc/.gitignore
	new file:   3-networks-dual-svpc/README.md
	new file:   3-networks-dual-svpc/envs/development/README.md
	new file:   3-networks-dual-svpc/envs/development/backend.tf
	new file:   3-networks-dual-svpc/envs/development/backend.tf.cloud.example
	new file:   3-networks-dual-svpc/envs/development/main.tf
	new file:   3-networks-dual-svpc/envs/development/outputs.tf
	new file:   3-networks-dual-svpc/envs/development/providers.tf
	new file:   3-networks-dual-svpc/envs/development/variables.tf
	new file:   3-networks-dual-svpc/envs/development/versions.tf
	new file:   3-networks-dual-svpc/envs/non-production/README.md
	new file:   3-networks-dual-svpc/envs/non-production/backend.tf
	new file:   3-networks-dual-svpc/envs/non-production/backend.tf.cloud.example
	new file:   3-networks-dual-svpc/envs/non-production/main.tf
	new file:   3-networks-dual-svpc/envs/non-production/outputs.tf
	new file:   3-networks-dual-svpc/envs/non-production/providers.tf
	new file:   3-networks-dual-svpc/envs/non-production/variables.tf
	new file:   3-networks-dual-svpc/envs/non-production/versions.tf
	new file:   3-networks-dual-svpc/envs/production/README.md
	new file:   3-networks-dual-svpc/envs/production/backend.tf
	new file:   3-networks-dual-svpc/envs/production/backend.tf.cloud.example
	new file:   3-networks-dual-svpc/envs/production/main.tf
	new file:   3-networks-dual-svpc/envs/production/outputs.tf
	new file:   3-networks-dual-svpc/envs/production/providers.tf
	new file:   3-networks-dual-svpc/envs/production/variables.tf
	new file:   3-networks-dual-svpc/envs/production/versions.tf
	new file:   3-networks-dual-svpc/envs/shared/README.md
	new file:   3-networks-dual-svpc/envs/shared/backend.tf
	new file:   3-networks-dual-svpc/envs/shared/backend.tf.cloud.example
	new file:   3-networks-dual-svpc/envs/shared/dns-hub.tf
	new file:   3-networks-dual-svpc/envs/shared/hierarchical_firewall.tf
	new file:   3-networks-dual-svpc/envs/shared/interconnect.tf.example
	new file:   3-networks-dual-svpc/envs/shared/outputs.tf
	new file:   3-networks-dual-svpc/envs/shared/partner_interconnect.auto.tfvars.example
	new file:   3-networks-dual-svpc/envs/shared/partner_interconnect.tf.example
	new file:   3-networks-dual-svpc/envs/shared/providers.tf
	new file:   3-networks-dual-svpc/envs/shared/remote.tf
	new file:   3-networks-dual-svpc/envs/shared/remote.tf.cloud.example
	new file:   3-networks-dual-svpc/envs/shared/variables.tf
	new file:   3-networks-dual-svpc/envs/shared/versions.tf
	new file:   3-networks-dual-svpc/modules/base_env/README.md
	new file:   3-networks-dual-svpc/modules/base_env/interconnect.tf.example
	new file:   3-networks-dual-svpc/modules/base_env/main.tf
	new file:   3-networks-dual-svpc/modules/base_env/outputs.tf
	new file:   3-networks-dual-svpc/modules/base_env/partner_interconnect.tf.example
	new file:   3-networks-dual-svpc/modules/base_env/remote.tf
	new file:   3-networks-dual-svpc/modules/base_env/remote.tf.cloud.example
	new file:   3-networks-dual-svpc/modules/base_env/variables.tf
	new file:   3-networks-dual-svpc/modules/base_env/versions.tf
	new file:   3-networks-dual-svpc/modules/base_env/vpn.tf.example
	new file:   3-networks-dual-svpc/modules/base_shared_vpc/README.md
	new file:   3-networks-dual-svpc/modules/base_shared_vpc/dns.tf
	new file:   3-networks-dual-svpc/modules/base_shared_vpc/firewall.tf
	new file:   3-networks-dual-svpc/modules/base_shared_vpc/main.tf
	new file:   3-networks-dual-svpc/modules/base_shared_vpc/nat.tf
	new file:   3-networks-dual-svpc/modules/base_shared_vpc/outputs.tf
	new file:   3-networks-dual-svpc/modules/base_shared_vpc/private_service_connect.tf
	new file:   3-networks-dual-svpc/modules/base_shared_vpc/variables.tf
	new file:   3-networks-dual-svpc/modules/base_shared_vpc/versions.tf
	new file:   3-networks-dual-svpc/modules/dedicated_interconnect/README.md
	new file:   3-networks-dual-svpc/modules/dedicated_interconnect/main.tf
	new file:   3-networks-dual-svpc/modules/dedicated_interconnect/outputs.tf
	new file:   3-networks-dual-svpc/modules/dedicated_interconnect/variables.tf
	new file:   3-networks-dual-svpc/modules/dedicated_interconnect/versions.tf
	new file:   3-networks-dual-svpc/modules/hierarchical_firewall_policy/README.md
	new file:   3-networks-dual-svpc/modules/hierarchical_firewall_policy/main.tf
	new file:   3-networks-dual-svpc/modules/hierarchical_firewall_policy/outputs.tf
	new file:   3-networks-dual-svpc/modules/hierarchical_firewall_policy/variables.tf
	new file:   3-networks-dual-svpc/modules/hierarchical_firewall_policy/versions.tf
	new file:   3-networks-dual-svpc/modules/partner_interconnect/README.md
	new file:   3-networks-dual-svpc/modules/partner_interconnect/main.tf
	new file:   3-networks-dual-svpc/modules/partner_interconnect/outputs.tf
	new file:   3-networks-dual-svpc/modules/partner_interconnect/variables.tf
	new file:   3-networks-dual-svpc/modules/partner_interconnect/versions.tf
	new file:   3-networks-dual-svpc/modules/restricted_shared_vpc/README.md
	new file:   3-networks-dual-svpc/modules/restricted_shared_vpc/dns.tf
	new file:   3-networks-dual-svpc/modules/restricted_shared_vpc/firewall.tf
	new file:   3-networks-dual-svpc/modules/restricted_shared_vpc/main.tf
	new file:   3-networks-dual-svpc/modules/restricted_shared_vpc/nat.tf
	new file:   3-networks-dual-svpc/modules/restricted_shared_vpc/outputs.tf
	new file:   3-networks-dual-svpc/modules/restricted_shared_vpc/private_service_connect.tf
	new file:   3-networks-dual-svpc/modules/restricted_shared_vpc/service_control.tf
	new file:   3-networks-dual-svpc/modules/restricted_shared_vpc/variables.tf
	new file:   3-networks-dual-svpc/modules/restricted_shared_vpc/versions.tf
	new file:   3-networks-dual-svpc/modules/vpn-ha/README.md
	new file:   3-networks-dual-svpc/modules/vpn-ha/main.tf
	new file:   3-networks-dual-svpc/modules/vpn-ha/variables.tf
	new file:   3-networks-hub-and-spoke/.gitignore
	new file:   3-networks-hub-and-spoke/README.md
	new file:   3-networks-hub-and-spoke/envs/development/README.md
	new file:   3-networks-hub-and-spoke/envs/development/backend.tf
	new file:   3-networks-hub-and-spoke/envs/development/backend.tf.cloud.example
	new file:   3-networks-hub-and-spoke/envs/development/main.tf
	new file:   3-networks-hub-and-spoke/envs/development/outputs.tf
	new file:   3-networks-hub-and-spoke/envs/development/providers.tf
	new file:   3-networks-hub-and-spoke/envs/development/variables.tf
	new file:   3-networks-hub-and-spoke/envs/development/versions.tf
	new file:   3-networks-hub-and-spoke/envs/non-production/README.md
	new file:   3-networks-hub-and-spoke/envs/non-production/backend.tf
	new file:   3-networks-hub-and-spoke/envs/non-production/backend.tf.cloud.example
	new file:   3-networks-hub-and-spoke/envs/non-production/main.tf
	new file:   3-networks-hub-and-spoke/envs/non-production/outputs.tf
	new file:   3-networks-hub-and-spoke/envs/non-production/providers.tf
	new file:   3-networks-hub-and-spoke/envs/non-production/variables.tf
	new file:   3-networks-hub-and-spoke/envs/non-production/versions.tf
	new file:   3-networks-hub-and-spoke/envs/production/README.md
	new file:   3-networks-hub-and-spoke/envs/production/backend.tf
	new file:   3-networks-hub-and-spoke/envs/production/backend.tf.cloud.example
	new file:   3-networks-hub-and-spoke/envs/production/main.tf
	new file:   3-networks-hub-and-spoke/envs/production/outputs.tf
	new file:   3-networks-hub-and-spoke/envs/production/providers.tf
	new file:   3-networks-hub-and-spoke/envs/production/variables.tf
	new file:   3-networks-hub-and-spoke/envs/production/versions.tf
	new file:   3-networks-hub-and-spoke/envs/shared/README.md
	new file:   3-networks-hub-and-spoke/envs/shared/backend.tf
	new file:   3-networks-hub-and-spoke/envs/shared/backend.tf.cloud.example
	new file:   3-networks-hub-and-spoke/envs/shared/dns-hub.tf
	new file:   3-networks-hub-and-spoke/envs/shared/hierarchical_firewall.tf
	new file:   3-networks-hub-and-spoke/envs/shared/interconnect.auto.tfvars.example
	new file:   3-networks-hub-and-spoke/envs/shared/interconnect.tf.example
	new file:   3-networks-hub-and-spoke/envs/shared/main.tf
	new file:   3-networks-hub-and-spoke/envs/shared/net-hubs-transitivity.tf
	new file:   3-networks-hub-and-spoke/envs/shared/net-hubs.tf
	new file:   3-networks-hub-and-spoke/envs/shared/outputs.tf
	new file:   3-networks-hub-and-spoke/envs/shared/partner_interconnect.auto.tfvars.example
	new file:   3-networks-hub-and-spoke/envs/shared/partner_interconnect.tf.example
	new file:   3-networks-hub-and-spoke/envs/shared/providers.tf
	new file:   3-networks-hub-and-spoke/envs/shared/remote.tf
	new file:   3-networks-hub-and-spoke/envs/shared/remote.tf.cloud.example
	new file:   3-networks-hub-and-spoke/envs/shared/variables.tf
	new file:   3-networks-hub-and-spoke/envs/shared/versions.tf
	new file:   3-networks-hub-and-spoke/modules/base_env/README.md
	new file:   3-networks-hub-and-spoke/modules/base_env/main.tf
	new file:   3-networks-hub-and-spoke/modules/base_env/outputs.tf
	new file:   3-networks-hub-and-spoke/modules/base_env/remote.tf
	new file:   3-networks-hub-and-spoke/modules/base_env/remote.tf.cloud.example
	new file:   3-networks-hub-and-spoke/modules/base_env/variables.tf
	new file:   3-networks-hub-and-spoke/modules/base_env/versions.tf
	new file:   3-networks-hub-and-spoke/modules/base_env/vpn.tf.example
	new file:   3-networks-hub-and-spoke/modules/base_shared_vpc/README.md
	new file:   3-networks-hub-and-spoke/modules/base_shared_vpc/dns.tf
	new file:   3-networks-hub-and-spoke/modules/base_shared_vpc/firewall.tf
	new file:   3-networks-hub-and-spoke/modules/base_shared_vpc/main.tf
	new file:   3-networks-hub-and-spoke/modules/base_shared_vpc/nat.tf
	new file:   3-networks-hub-and-spoke/modules/base_shared_vpc/outputs.tf
	new file:   3-networks-hub-and-spoke/modules/base_shared_vpc/private_service_connect.tf
	new file:   3-networks-hub-and-spoke/modules/base_shared_vpc/variables.tf
	new file:   3-networks-hub-and-spoke/modules/base_shared_vpc/versions.tf
	new file:   3-networks-hub-and-spoke/modules/dedicated_interconnect/README.md
	new file:   3-networks-hub-and-spoke/modules/dedicated_interconnect/main.tf
	new file:   3-networks-hub-and-spoke/modules/dedicated_interconnect/outputs.tf
	new file:   3-networks-hub-and-spoke/modules/dedicated_interconnect/variables.tf
	new file:   3-networks-hub-and-spoke/modules/dedicated_interconnect/versions.tf
	new file:   3-networks-hub-and-spoke/modules/hierarchical_firewall_policy/README.md
	new file:   3-networks-hub-and-spoke/modules/hierarchical_firewall_policy/main.tf
	new file:   3-networks-hub-and-spoke/modules/hierarchical_firewall_policy/outputs.tf
	new file:   3-networks-hub-and-spoke/modules/hierarchical_firewall_policy/variables.tf
	new file:   3-networks-hub-and-spoke/modules/hierarchical_firewall_policy/versions.tf
	new file:   3-networks-hub-and-spoke/modules/partner_interconnect/README.md
	new file:   3-networks-hub-and-spoke/modules/partner_interconnect/main.tf
	new file:   3-networks-hub-and-spoke/modules/partner_interconnect/outputs.tf
	new file:   3-networks-hub-and-spoke/modules/partner_interconnect/variables.tf
	new file:   3-networks-hub-and-spoke/modules/partner_interconnect/versions.tf
	new file:   3-networks-hub-and-spoke/modules/restricted_shared_vpc/README.md
	new file:   3-networks-hub-and-spoke/modules/restricted_shared_vpc/dns.tf
	new file:   3-networks-hub-and-spoke/modules/restricted_shared_vpc/firewall.tf
	new file:   3-networks-hub-and-spoke/modules/restricted_shared_vpc/main.tf
	new file:   3-networks-hub-and-spoke/modules/restricted_shared_vpc/nat.tf
	new file:   3-networks-hub-and-spoke/modules/restricted_shared_vpc/outputs.tf
	new file:   3-networks-hub-and-spoke/modules/restricted_shared_vpc/private_service_connect.tf
	new file:   3-networks-hub-and-spoke/modules/restricted_shared_vpc/service_control.tf
	new file:   3-networks-hub-and-spoke/modules/restricted_shared_vpc/variables.tf
	new file:   3-networks-hub-and-spoke/modules/restricted_shared_vpc/versions.tf
	new file:   3-networks-hub-and-spoke/modules/transitivity/README.md
	new file:   3-networks-hub-and-spoke/modules/transitivity/assets/gw.yaml
	new file:   3-networks-hub-and-spoke/modules/transitivity/main.tf
	new file:   3-networks-hub-and-spoke/modules/transitivity/variables.tf
	new file:   3-networks-hub-and-spoke/modules/transitivity/versions.tf
	new file:   3-networks-hub-and-spoke/modules/vpn-ha/README.md
	new file:   3-networks-hub-and-spoke/modules/vpn-ha/main.tf
	new file:   3-networks-hub-and-spoke/modules/vpn-ha/variables.tf
	new file:   4-projects/.gitignore
	new file:   4-projects/README.md
	new file:   4-projects/business_unit_1/development/README.md
	new file:   4-projects/business_unit_1/development/backend.tf
	new file:   4-projects/business_unit_1/development/backend.tf.cloud.example
	new file:   4-projects/business_unit_1/development/main.tf
	new file:   4-projects/business_unit_1/development/outputs.tf
	new file:   4-projects/business_unit_1/development/variables.tf
	new file:   4-projects/business_unit_1/non-production/README.md
	new file:   4-projects/business_unit_1/non-production/backend.tf
	new file:   4-projects/business_unit_1/non-production/backend.tf.cloud.example
	new file:   4-projects/business_unit_1/non-production/main.tf
	new file:   4-projects/business_unit_1/non-production/outputs.tf
	new file:   4-projects/business_unit_1/non-production/variables.tf
	new file:   4-projects/business_unit_1/production/README.md
	new file:   4-projects/business_unit_1/production/backend.tf
	new file:   4-projects/business_unit_1/production/backend.tf.cloud.example
	new file:   4-projects/business_unit_1/production/main.tf
	new file:   4-projects/business_unit_1/production/outputs.tf
	new file:   4-projects/business_unit_1/production/variables.tf
	new file:   4-projects/business_unit_1/shared/README.md
	new file:   4-projects/business_unit_1/shared/backend.tf
	new file:   4-projects/business_unit_1/shared/backend.tf.cloud.example
	new file:   4-projects/business_unit_1/shared/example_infra_pipeline.tf
	new file:   4-projects/business_unit_1/shared/outputs.tf
	new file:   4-projects/business_unit_1/shared/remote.tf
	new file:   4-projects/business_unit_1/shared/remote.tf.cloud.example
	new file:   4-projects/business_unit_1/shared/variables.tf
	new file:   4-projects/business_unit_2/development/README.md
	new file:   4-projects/business_unit_2/development/backend.tf
	new file:   4-projects/business_unit_2/development/backend.tf.cloud.example
	new file:   4-projects/business_unit_2/development/main.tf
	new file:   4-projects/business_unit_2/development/outputs.tf
	new file:   4-projects/business_unit_2/development/variables.tf
	new file:   4-projects/business_unit_2/non-production/README.md
	new file:   4-projects/business_unit_2/non-production/backend.tf
	new file:   4-projects/business_unit_2/non-production/backend.tf.cloud.example
	new file:   4-projects/business_unit_2/non-production/main.tf
	new file:   4-projects/business_unit_2/non-production/outputs.tf
	new file:   4-projects/business_unit_2/non-production/variables.tf
	new file:   4-projects/business_unit_2/production/README.md
	new file:   4-projects/business_unit_2/production/backend.tf
	new file:   4-projects/business_unit_2/production/backend.tf.cloud.example
	new file:   4-projects/business_unit_2/production/main.tf
	new file:   4-projects/business_unit_2/production/outputs.tf
	new file:   4-projects/business_unit_2/production/variables.tf
	new file:   4-projects/business_unit_2/shared/README.md
	new file:   4-projects/business_unit_2/shared/backend.tf
	new file:   4-projects/business_unit_2/shared/backend.tf.cloud.example
	new file:   4-projects/business_unit_2/shared/example_infra_pipeline.tf
	new file:   4-projects/business_unit_2/shared/outputs.tf
	new file:   4-projects/business_unit_2/shared/remote.tf
	new file:   4-projects/business_unit_2/shared/remote.tf.cloud.example
	new file:   4-projects/business_unit_2/shared/variables.tf
	new file:   4-projects/modules/base_env/README.md
	new file:   4-projects/modules/base_env/business_unit_folder.tf
	new file:   4-projects/modules/base_env/example_base_shared_vpc_project.tf
	new file:   4-projects/modules/base_env/example_floating_project.tf
	new file:   4-projects/modules/base_env/example_peering_project.tf
	new file:   4-projects/modules/base_env/example_restricted_shared_vpc_project.tf
	new file:   4-projects/modules/base_env/example_storage_cmek.tf
	new file:   4-projects/modules/base_env/outputs.tf
	new file:   4-projects/modules/base_env/remote.tf
	new file:   4-projects/modules/base_env/remote.tf.cloud.example
	new file:   4-projects/modules/base_env/variables.tf
	new file:   4-projects/modules/base_env/versions.tf
	new file:   4-projects/modules/infra_pipelines/README.md
	new file:   4-projects/modules/infra_pipelines/main.tf
	new file:   4-projects/modules/infra_pipelines/outputs.tf
	new file:   4-projects/modules/infra_pipelines/variables.tf
	new file:   4-projects/modules/infra_pipelines/versions.tf
	new file:   4-projects/modules/single_project/README.md
	new file:   4-projects/modules/single_project/main.tf
	new file:   4-projects/modules/single_project/outputs.tf
	new file:   4-projects/modules/single_project/variables.tf
	new file:   4-projects/modules/single_project/versions.tf
	new file:   5-app-infra/.gitignore
	new file:   5-app-infra/README.md
	new file:   5-app-infra/business_unit_1/development/README.md
	new file:   5-app-infra/business_unit_1/development/backend.tf
	new file:   5-app-infra/business_unit_1/development/main.tf
	new file:   5-app-infra/business_unit_1/development/outputs.tf
	new file:   5-app-infra/business_unit_1/development/variables.tf
	new file:   5-app-infra/business_unit_1/development/versions.tf
	new file:   5-app-infra/business_unit_1/non-production/README.md
	new file:   5-app-infra/business_unit_1/non-production/backend.tf
	new file:   5-app-infra/business_unit_1/non-production/main.tf
	new file:   5-app-infra/business_unit_1/non-production/outputs.tf
	new file:   5-app-infra/business_unit_1/non-production/variables.tf
	new file:   5-app-infra/business_unit_1/non-production/versions.tf
	new file:   5-app-infra/business_unit_1/production/README.md
	new file:   5-app-infra/business_unit_1/production/backend.tf
	new file:   5-app-infra/business_unit_1/production/main.tf
	new file:   5-app-infra/business_unit_1/production/outputs.tf
	new file:   5-app-infra/business_unit_1/production/variables.tf
	new file:   5-app-infra/business_unit_1/production/versions.tf
	new file:   5-app-infra/modules/env_base/README.md
	new file:   5-app-infra/modules/env_base/main.tf
	new file:   5-app-infra/modules/env_base/outputs.tf
	new file:   5-app-infra/modules/env_base/variables.tf
	new file:   5-app-infra/modules/env_base/versions.tf
	new file:   CHANGELOG.md
	modified:   CONTRIBUTING.MD
	new file:   ERRATA.md
	new file:   LICENSE
	new file:   Makefile
	new file:   README.md
	new file:   build/Jenkinsfile
	new file:   build/cloudbuild-tf-apply.yaml
	new file:   build/cloudbuild-tf-plan.yaml
	new file:   build/github-tf-apply.yaml
	new file:   build/github-tf-pull-request.yaml
	new file:   build/gitlab-ci.yml
	new file:   build/int.cloudbuild.yaml
	new file:   build/lint.cloudbuild.yaml
	new file:   build/run_gcp_auth.sh
	new file:   build/tf-wrapper.sh
	new file:   docs/FAQ.md
	new file:   docs/GLOSSARY.md
	new file:   docs/TROUBLESHOOTING.md
	new file:   docs/change_resource_hierarchy.md
	new file:   docs/upgrading_to_v2.0.md
	new file:   docs/upgrading_to_v3.0.md
	new file:   docs/upgrading_to_v4.0.md
	new file:   go.work
	new file:   helpers/foundation-deployer/README.md
	new file:   helpers/foundation-deployer/gcp/gcp.go
	new file:   helpers/foundation-deployer/gcp/gcp_test.go
	new file:   helpers/foundation-deployer/gcp/testdata/failure_build.json
	new file:   helpers/foundation-deployer/gcp/testdata/queued_build.json
	new file:   helpers/foundation-deployer/gcp/testdata/success_build.json
	new file:   helpers/foundation-deployer/gcp/testdata/working_build.json
	new file:   helpers/foundation-deployer/global.tfvars.example
	new file:   helpers/foundation-deployer/go.mod
	new file:   helpers/foundation-deployer/go.sum
	new file:   helpers/foundation-deployer/main.go
	new file:   helpers/foundation-deployer/msg/msg.go
	new file:   helpers/foundation-deployer/stages/apply.go
	new file:   helpers/foundation-deployer/stages/data.go
	new file:   helpers/foundation-deployer/stages/destroy.go
	new file:   helpers/foundation-deployer/stages/validate.go
	new file:   helpers/foundation-deployer/stages/vet.go
	new file:   helpers/foundation-deployer/steps/steps.go
	new file:   helpers/foundation-deployer/steps/steps_test.go
	new file:   helpers/foundation-deployer/steps/testdata/existing.json
	new file:   helpers/foundation-deployer/utils/files.go
	new file:   helpers/foundation-deployer/utils/files_test.go
	new file:   helpers/foundation-deployer/utils/git.go
	new file:   helpers/foundation-deployer/utils/git_test.go
	new file:   helpers/foundation-deployer/utils/logger.go
	new file:   helpers/foundation-deployer/utils/tfvars.go
	new file:   helpers/foundation-deployer/utils/tfvars_test.go
	new file:   policy-library/lib/constraints.rego
	new file:   policy-library/lib/util.rego
	new file:   policy-library/lib/util_test.rego
	new file:   policy-library/policies/constraints/appengine_versions.yaml
	new file:   policy-library/policies/constraints/bigquery_world_readable.yaml
	new file:   policy-library/policies/constraints/dnssec_prevent_rsasha1_ksk.yaml
	new file:   policy-library/policies/constraints/dnssec_prevent_rsasha1_zsk.yaml
	new file:   policy-library/policies/constraints/gke_allow_only_private_cluster.yaml
	new file:   policy-library/policies/constraints/gke_allowed_node_sa_scope.yaml
	new file:   policy-library/policies/constraints/gke_container_optimized_os.yaml
	new file:   policy-library/policies/constraints/gke_dashboard_disable.yaml
	new file:   policy-library/policies/constraints/gke_disable_default_service_account.yaml
	new file:   policy-library/policies/constraints/gke_disable_legacy_endpoints.yaml
	new file:   policy-library/policies/constraints/gke_enable_alias_ip_ranges.yaml
	new file:   policy-library/policies/constraints/gke_legacy_abac.yaml
	new file:   policy-library/policies/constraints/gke_master_authorized_networks_enabled.yaml
	new file:   policy-library/policies/constraints/gke_node_pool_auto_repair.yaml
	new file:   policy-library/policies/constraints/gke_node_pool_auto_upgrade.yaml
	new file:   policy-library/policies/constraints/gke_restrict_client_auth_methods.yaml
	new file:   policy-library/policies/constraints/gke_restrict_pod_traffic.yaml
	new file:   policy-library/policies/constraints/iam_deny_public.yaml
	new file:   policy-library/policies/constraints/network_enable_flow_logs.yaml
	new file:   policy-library/policies/constraints/network_enable_private_google_access.yaml
	new file:   policy-library/policies/constraints/restrict_fw_rules_rdp_world_open.yaml
	new file:   policy-library/policies/constraints/restrict_fw_rules_ssh_world_open.yaml
	new file:   policy-library/policies/constraints/restrict_fw_rules_world_open.yaml
	new file:   policy-library/policies/constraints/serviceusage_allow_basic_apis.yaml
	new file:   policy-library/policies/constraints/sql_public_ip.yaml
	new file:   policy-library/policies/constraints/sql_ssl.yaml
	new file:   policy-library/policies/constraints/storage_bucket_policy_only.yaml
	new file:   policy-library/policies/constraints/storage_denylist_public.yaml
	new file:   policy-library/policies/templates/gcp_allowed_resource_types.yaml
	new file:   policy-library/policies/templates/gcp_always_violates_v1.yaml
	new file:   policy-library/policies/templates/gcp_app_service_versions.yaml
	new file:   policy-library/policies/templates/gcp_appengine_location_v1.yaml
	new file:   policy-library/policies/templates/gcp_bigquery_cmek_encryption_v1.yaml
	new file:   policy-library/policies/templates/gcp_bigquery_dataset_world_readable_v1.yaml
	new file:   policy-library/policies/templates/gcp_bigquery_table_retention_v1.yaml
	new file:   policy-library/policies/templates/gcp_bq_dataset_location_v1.yaml
	new file:   policy-library/policies/templates/gcp_cmek_rotation_v1.yaml
	new file:   policy-library/policies/templates/gcp_cmek_settings_v1.yaml
	new file:   policy-library/policies/templates/gcp_compute_allowed_networks.yaml
	new file:   policy-library/policies/templates/gcp_compute_disk_resource_policies_v1.yaml
	new file:   policy-library/policies/templates/gcp_compute_external_ip_address.yaml
	new file:   policy-library/policies/templates/gcp_compute_ip_forward.yaml
	new file:   policy-library/policies/templates/gcp_compute_zone_v1.yaml
	new file:   policy-library/policies/templates/gcp_dataproc_location_v1.yaml
	new file:   policy-library/policies/templates/gcp_dnssec_prevent_rsasha1_v1.yaml
	new file:   policy-library/policies/templates/gcp_dnssec_v1.yaml
	new file:   policy-library/policies/templates/gcp_enforce_labels_v1.yaml
	new file:   policy-library/policies/templates/gcp_enforce_naming_v1.yaml
	new file:   policy-library/policies/templates/gcp_gke_allowed_node_sa_v1.yaml
	new file:   policy-library/policies/templates/gcp_gke_cluster_location.yaml
	new file:   policy-library/policies/templates/gcp_gke_cluster_version_v1.yaml
	new file:   policy-library/policies/templates/gcp_gke_container_optimized_os.yaml
	new file:   policy-library/policies/templates/gcp_gke_dashboard_v1.yaml
	new file:   policy-library/policies/templates/gcp_gke_disable_default_service_account_v1.yaml
	new file:   policy-library/policies/templates/gcp_gke_disable_legacy_endpoints_v1.yaml
	new file:   policy-library/policies/templates/gcp_gke_enable_alias_ip_ranges.yaml
	new file:   policy-library/policies/templates/gcp_gke_enable_private_endpoint.yaml
	new file:   policy-library/policies/templates/gcp_gke_enable_shielded_nodes_v1.yaml
	new file:   policy-library/policies/templates/gcp_gke_enable_stackdriver_kubernetes_engine_monitoring_v1.yaml
	new file:   policy-library/policies/templates/gcp_gke_enable_stackdriver_logging_v1.yaml
	new file:   policy-library/policies/templates/gcp_gke_enable_stackdriver_monitoring_v1.yaml
	new file:   policy-library/policies/templates/gcp_gke_enable_workload_identity_v1.yaml
	new file:   policy-library/policies/templates/gcp_gke_legacy_abac_v1.yaml
	new file:   policy-library/policies/templates/gcp_gke_master_authorized_networks_enabled_v1.yaml
	new file:   policy-library/policies/templates/gcp_gke_node_auto_repair_v1.yaml
	new file:   policy-library/policies/templates/gcp_gke_node_auto_upgrade_v1.yaml
	new file:   policy-library/policies/templates/gcp_gke_private_cluster_v1.yaml
	new file:   policy-library/policies/templates/gcp_gke_restrict_client_auth_methods_v1.yaml
	new file:   policy-library/policies/templates/gcp_gke_restrict_pod_traffic_v1.yaml
	new file:   policy-library/policies/templates/gcp_glb_external_ip_access_constraint_v1.yaml
	new file:   policy-library/policies/templates/gcp_iam_allow_ban_roles_v1.yaml
	new file:   policy-library/policies/templates/gcp_iam_allowed_bindings.yaml
	new file:   policy-library/policies/templates/gcp_iam_allowed_policy_member_domains.yaml
	new file:   policy-library/policies/templates/gcp_iam_audit_log.yaml
	new file:   policy-library/policies/templates/gcp_iam_custom_role_permissions_v1.yaml
	new file:   policy-library/policies/templates/gcp_iam_required_bindings_v1.yaml
	new file:   policy-library/policies/templates/gcp_iam_restrict_service_account_creation_v1.yaml
	new file:   policy-library/policies/templates/gcp_iam_restrict_service_account_key_age_v1.yaml
	new file:   policy-library/policies/templates/gcp_iam_restrict_service_account_key_type_v1.yaml
	new file:   policy-library/policies/templates/gcp_lb_forwarding_rules.yaml
	new file:   policy-library/policies/templates/gcp_network_enable_firewall_logs_v1.yaml
	new file:   policy-library/policies/templates/gcp_network_enable_flow_logs_v1.yaml
	new file:   policy-library/policies/templates/gcp_network_enable_private_google_access_v1.yaml
	new file:   policy-library/policies/templates/gcp_network_restrict_default_v1.yaml
	new file:   policy-library/policies/templates/gcp_network_routing_v1.yaml
	new file:   policy-library/policies/templates/gcp_resource_value_pattern_v1.yaml
	new file:   policy-library/policies/templates/gcp_restricted_firewall_rules_v1.yaml
	new file:   policy-library/policies/templates/gcp_serviceusage_allowed_services_v1.yaml
	new file:   policy-library/policies/templates/gcp_spanner_location_v1.yaml
	new file:   policy-library/policies/templates/gcp_sql_allowed_authorized_networks_v1.yaml
	new file:   policy-library/policies/templates/gcp_sql_backup_v1.yaml
	new file:   policy-library/policies/templates/gcp_sql_instance_type_v1.yaml
	new file:   policy-library/policies/templates/gcp_sql_location_v1.yaml
	new file:   policy-library/policies/templates/gcp_sql_maintenance_window_v1.yaml
	new file:   policy-library/policies/templates/gcp_sql_public_ip_v1.yaml
	new file:   policy-library/policies/templates/gcp_sql_ssl_v1.yaml
	new file:   policy-library/policies/templates/gcp_sql_world_readable_v1.yaml
	new file:   policy-library/policies/templates/gcp_storage_bucket_policy_only_v1.yaml
	new file:   policy-library/policies/templates/gcp_storage_bucket_retention_v1.yaml
	new file:   policy-library/policies/templates/gcp_storage_bucket_world_readable_v1.yaml
	new file:   policy-library/policies/templates/gcp_storage_cmek_encryption_v1.yaml
	new file:   policy-library/policies/templates/gcp_storage_location_v1.yaml
	new file:   policy-library/policies/templates/gcp_storage_logging_v1.yaml
	new file:   policy-library/policies/templates/gcp_vpc_sc_allowed_regions.yaml
	new file:   policy-library/policies/templates/gcp_vpc_sc_ensure_access_levels_v1.yaml
	new file:   policy-library/policies/templates/gcp_vpc_sc_ensure_project_v1.yaml
	new file:   policy-library/policies/templates/gcp_vpc_sc_ensure_services_v1.yaml
	new file:   policy-library/policies/templates/gcp_vpc_sc_ip_range_v1.yaml
	new file:   policy-library/policies/templates/gcp_vpc_sc_project_perimeter.yaml
	new file:   scripts/set-tfc-backend-and-remote.sh
	new file:   scripts/validate-requirements.sh
	new file:   test/clean_org.sh
	new file:   test/disable_tf_files.sh
	new file:   test/integration/app-infra/app_infra_test.go
	new file:   test/integration/bootstrap/bootstrap_test.go
	new file:   test/integration/envs/envs_test.go
	new file:   test/integration/go.mod
	new file:   test/integration/go.sum
	new file:   test/integration/networks/networks_test.go
	new file:   test/integration/org/org_test.go
	new file:   test/integration/projects-shared/projects_shared_test.go
	new file:   test/integration/projects/projects_test.go
	new file:   test/integration/shared/shared_test.go
	new file:   test/integration/testutils/api.go
	new file:   test/integration/testutils/gcp.go
	new file:   test/integration/testutils/retry.go
	new file:   test/integration/testutils/strings.go
	new file:   test/integration/testutils/transforms.go
	new file:   test/restore_tf_files.sh
	new file:   test/setup/iam.tf
	new file:   test/setup/main.tf
	new file:   test/setup/outputs.tf
	new file:   test/setup/variables.tf


MINOR: update log and method name

update an unclear log message and method name
Committer Checklist (excluded from commit message)

[ ] Verify design and implementation
[ ] Verify test coverage and CI build status
[ ] Verify documentation (including upgrade notes)

Re-trigger the jenkins jobs.

Tests were still failing despite Guozhang having retriggered them after the fix was merged, I don't see how this patch could be causing those tests to fail again but I retriggered the build one more time just to be sure
@wcarlson5 please ping me or Guozhang again when it passes and we can merge

Test failures are unrelated:
kafka.server.ReplicaManagerTest.[1] usesTopicIds=true
kafka.api.PlaintextConsumerTest.testPerPartitionLagMetricsCleanUpWithSubscribe()

Merged to trunk


[Question] Setting Destination obfs3 server

Hi. How do i set the destination obfs3 server for android? and also how to set to use transparent-tcp instead of default transport? Or am i looking at the wrong library? Thank you

Hi. How do i set the destination obfs3 server for android?

This is done via configuring Tor. Here is an example from Onion Browser: (That's Swift on iOS, but the configuration of Tor is the same on all platforms)
https://github.com/OnionBrowser/OnionBrowser/blob/2.X/OnionBrowser/OnionManager.swift#L58
https://github.com/OnionBrowser/OnionBrowser/blob/2.X/OnionBrowser/OnionManager.swift#L95
https://github.com/OnionBrowser/OnionBrowser/blob/2.X/OnionBrowser/OnionManager.swift#L514-L522
https://github.com/OnionBrowser/OnionBrowser/blob/2.X/OnionBrowser/OnionManager.swift#L539-L554

and also how to set to use transparent-tcp instead of default transport? Or am i looking at the wrong library? Thank you

Sorry, no idea what you're talking about here.

Thank you!


Print Slip

Need a basic "Packing Slip" button on order details that is printable.

sorry for the probably retard question but what data do you think should be on the packing slip?

Much the same information as seen on the Order Details page minus the order status's probably.
That said, one issue I've seen come up is pricing information. People will buy a product as a gift and not wish to have the pricing information shown on the slip.


Education page redesign

The team would like to add some structure to the Education page (and possibly rename it?)
Sections discussed:

Watch and Learn: webinar recordings, etc
Read and Learn: online resources developed by the STAR team
Interact and Learn: SkillSTAR

This needs to be prioritized. Right now, all the resources on UVA Education are sorted by recently updated. It is difficult to arrange the order when there is a subtle change to the resource (I need to go through all the resources). Now that hope summit videos will be updated - we do want to have those videos to be "featured" or "recommended". I think we can do this by reflecting "favorites" of admin or user / or having search/filter function. Other ideas are welcome.


We should have sounds on click

Gimme some life in this game.
For the record I mean UI.

true!

Since we have sounds on click, this issue is resolved.


poedit: 2.2.4 -> 2.3

Semi-automatic update generated by https://github.com/ryantm/nixpkgs-update tools. This update was made based on information from https://repology.org/metapackage/poedit/versions.
meta.description for poedit is: '"Cross-platform gettext catalogs (.po files) editor"'.
meta.homepage for poedit is: '"https://www.poedit.net/"
Release on GitHub
Compare changes on GitHub

Checks done (click to expand)

built on NixOS

The tests defined in passthru.tests, if any, passed

0 of 0 passed binary check by having a zero exit code.

0 of 0 passed binary check by having the new version present in output.

found 2.3 with grep in /nix/store/j9cspmvd7iqb9a76v8wdnwd87x21vpkx-poedit-2.3

directory tree listing: https://gist.github.com/a44e7576f98d690c14760a2edff1c5d5

du listing: https://gist.github.com/46e1c865ef6b8ae1c5ed93ae9beed93c

Rebuild report (if merged into master) (click to expand)

4 total rebuild path(s)
1 package rebuild(s)
1 x86_64-linux rebuild(s)
1 i686-linux rebuild(s)
1 x86_64-darwin rebuild(s)
1 aarch64-linux rebuild(s)
First fifty rebuilds by attrpath
poedit

Instructions to test this update (click to expand)

Either download from Cachix:
nix-store -r /nix/store/j9cspmvd7iqb9a76v8wdnwd87x21vpkx-poedit-2.3 \
  --option binary-caches 'https://cache.nixos.org/ https://r-ryantm.cachix.org/' \
  --option trusted-public-keys '
  r-ryantm.cachix.org-1:gkUbLkouDAyvBdpBX0JOdIiD2/DP1ldF3Z3Y6Gqcc4c=
  cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=
  '

(r-ryantm's Cachix cache is only trusted for this store-path realization.)
For the Cachix download to work, your user must be in the trusted-users list or you can use sudo since root is effectively trusted.
Or, build yourself:
nix-build -A poedit https://github.com/r-ryantm/nixpkgs/archive/b6cd45699a5258eb38d9ac40f3477e112ff22288.tar.gz

After you've downloaded or built it, look at the files and if there are any, run the binaries:
ls -la /nix/store/j9cspmvd7iqb9a76v8wdnwd87x21vpkx-poedit-2.3
ls -la /nix/store/j9cspmvd7iqb9a76v8wdnwd87x21vpkx-poedit-2.3/bin

cc @domenkozar @bignaux for testing.

Tried editing a random .po file I found in /nix/store a bit and looks like it's working properly.


Support for Notification Channel on Android

Hello,
Is there support for notification channel on flutter Android? I see a method in the native sdk, but not for flutter.
Thanks!

Hi @bawahakim,
Thanks for reaching out. We'd be glad to assist.
Absolutely, the Pushy Flutter SDK automatically takes care of creating and assigning a notification channel to incoming notifications:
https://github.com/pushy/pushy-flutter/blob/3d30ef71cec51859115e82cf1a24a90e210aa6a2/android/src/main/java/me/pushy/sdk/flutter/PushyPlugin.java#L566
This happens automatically when you call Pushy.notify() in your backgroundNotificationListener():
@pragma('vm:entry-point')
void backgroundNotificationListener(Map<String, dynamic> data) {
    // Print notification payload data
    print('Received notification: $data');

    // Notification title
    String notificationTitle = 'MyApp';

    // Attempt to extract the "message" property from the payload: {"message":"Hello World!"}
    String notificationText = data['message'] ?? 'Hello World!';

    // Android: Displays a system notification
    // iOS: Displays an alert dialog
    Pushy.notify(notificationTitle, notificationText, data);

    // Clear iOS app badge number
    Pushy.clearBadge();
}

Please let us know if there's anything else we can help with.

Thanks! It's great that it automatically happens, but it seems like it doesn't give us flexibility to add our own channel name, description and group (and other smaller settings like LED color). Currently I only see "Push Notifications" category under "Other", even though I sent multiple notifications already. And also no way to localize the content.

Hi @bawahakim,
That's correct, the default implementation does not allow customizing the notification channel name, description, nor group, or other settings, as you mentioned.
To customize the Android notification channel display and behavior on Flutter, consider using a package called flutter_local_notifications which allows granular configuration of local Android notifications and their channels, instead of calling Pushy.notify(...) in your backgroundNotificationListener().
Example code to display a local notification with flutter_local_notifications:
const AndroidNotificationDetails androidPlatformChannelSpecifics =
    AndroidNotificationDetails(
        'your channel id', 'your channel name', 'your channel description',
        importance: Importance.max,
        priority: Priority.high,
        showWhen: false);
const NotificationDetails platformChannelSpecifics =
    NotificationDetails(android: androidPlatformChannelSpecifics);
await flutterLocalNotificationsPlugin.show(
    0, 'plain title', 'plain body', platformChannelSpecifics,
    payload: 'item x');

Please refer to the docs for configuring custom notification icons and sounds.
To migrate to flutter_local_notifications, remove the following line of code in your backgroundNotificationListener() and invoke the plugin instead:
Pushy.notify(notificationTitle, notificationText, data);

Please give it a try, and let us know if you face any issues.


fixed cut-and-paste error on description of Docker Toolbox

- What I did
Updated the description of Docker Toolbox for the Windows install doc. (There was a cut-and-paste error that referred to Mac OS X.)
Signed-off-by: Victoria Bialas<EMAIL_ADDRESS>

heh, nice catch, thanks!
LGTM


Cohere example - OpenAI or Azure OpenAI API key not found

Probably not the best issue, but..!
We are simply testing the Cohere example on Windows, but it throws Error: OpenAI or Azure OpenAI API key not found.
Now, this looked like Cohere would do the embeddings, etc. - so is OpenAI really needed?
Just to make sure, since there is no .env.example, this is all set through global variables, right?
In other words:
set COHERE_API_KEY=abc

There was a bug around the default embedding being OpenAI3Small - loading of which was attempted regardless of picking a different embedding model. I have addressed this issue in a new version published today (version 0.66)
Have also updated the examples with a 'example.env' file. Let me know if it works for you. All tests are done on Linux and Mac but it should work on Windows as well.

Will close this thread if there are no updates.


Do not propagate origin Connection:close to client http/2 session.

This is a concern about the commit created from PR #2106.  I like the commit in general, but this bit that closes the HTTP2 session if the origin response comes back with Connection: close seems wrong.
In the HTTP/1.1 case we do not propagate connection close from origin to client.  According the HTTP standard the connection header is a hop-by-hop header and should not be propagated in any case.  The HttpTransactHeaders::copy_header_fields() will drop the hop-by-hop headers when moving between client and origin (or origin and client).
I noticed this while testing a build.  The http2 test would fail due to errors about not being able to start new streams due to a half open session.  Track it down to the fact that the shutdown timer was being initiated after the first response (which had the connection: close header).

If Connection: close is propagated, that's the problem. However, the block is just using the header sent from ATS, if I implemented correctly.
If response header between ATS and a client has Connection: close, that means that ATS (core or some plugins) wants to close the connection. Since Connection: close header is not available on H2, that block initiates graceful shutdown instead.

yea, I feel like you removed the wrong block.

Hmm.  You are right.  This is just handling the response from ATS to client.  I encountered this problem running autest on my H2 to origin branch, so my directions got a bit messed up. I did have this check excluded for the other direction.
I still think there is a problem with the http2 autest, but it may be a test set up issue instead of a core issue.  Will close this for now and dig into this further.

@shinrich Maybe because of ignore_keep_alive()? I made it to return true to handle the the case I  explained above, but it returns false on your http2_origin_passthrough_dechunked branch.


An error occurred during training grefcoco datasets

During the training process of the RefCOCO dataset, the following error will occur.
File "/home/XXXXX/SimVG-main/simvg/apis/train.py", line 49, in train_model
for batch, inputs in enumerate(loader):
File "/usr/local/python3.10.12/lib/python3.10/site-packages/torch/utils/data/dataloader.py", line 630, in next
data = self._next_data()
File "/usr/local/python3.10.12/lib/python3.10/site-packages/torch/utils/data/dataloader.py", line 673, in _next_data
data = self._dataset_fetcher.fetch(index)  # may raise StopIteration
File "/usr/local/python3.10.12/lib/python3.10/site-packages/torch/utils/data/_utils/fetch.py", line 52, in fetch
data = [self.dataset[idx] for idx in possibly_batched_index]
File "/usr/local/python3.10.12/lib/python3.10/site-packages/torch/utils/data/_utils/fetch.py", line 52, in
data = [self.dataset[idx] for idx in possibly_batched_index]
File "/home/XXXXX/SimVG-main/simvg/datasets/base.py", line 70, in getitem
results = self.pipeline(results)
File "/home/XXXXX/SimVG-main/simvg/datasets/pipelines/compose.py", line 22, in call
results = transform(results)
File "/home/XXXXX/SimVG-main/simvg/datasets/pipelines/loading.py", line 275, in call
results = self._load_expression_tokenize_beit3(results)
File "/home/XXXXX/SimVG-main/simvg/datasets/pipelines/loading.py", line 162, in _load_expression_tokenize_beit3
expression = expressions[self.random_ind]
KeyError: 0

I've run into a similar issue. Is there any solution for it? @zhanght021 @Dmmm1997
Traceback (most recent call last):
  File "tools/train.py", line 223, in <module>
    main()
  File "tools/train.py", line 219, in main
    main_worker(cfg)
  File "tools/train.py", line 121, in main_worker
    train_model(epoch, cfg, model, model_ema, optimizer, dataloaders[0])
  File "/home/gpu18/workspace/SimVG/simvg/apis/train.py", line 49, in train_model
    for batch, inputs in enumerate(loader):
  File "/home/gpu18/anaconda3/envs/vg/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 630, in __next__
    data = self._next_data()
  File "/home/gpu18/anaconda3/envs/vg/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 1344, in _next_data
    return self._process_data(data)
  File "/home/gpu18/anaconda3/envs/vg/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 1370, in _process_data
    data.reraise()
  File "/home/gpu18/anaconda3/envs/vg/lib/python3.8/site-packages/torch/_utils.py", line 706, in reraise
    raise exception
KeyError: Caught KeyError in DataLoader worker process 0.
Original Traceback (most recent call last):
  File "/home/gpu18/anaconda3/envs/vg/lib/python3.8/site-packages/torch/utils/data/_utils/worker.py", line 309, in _worker_loop
    data = fetcher.fetch(index)  # type: ignore[possibly-undefined]
  File "/home/gpu18/anaconda3/envs/vg/lib/python3.8/site-packages/torch/utils/data/_utils/fetch.py", line 52, in fetch
    data = [self.dataset[idx] for idx in possibly_batched_index]
  File "/home/gpu18/anaconda3/envs/vg/lib/python3.8/site-packages/torch/utils/data/_utils/fetch.py", line 52, in <listcomp>
    data = [self.dataset[idx] for idx in possibly_batched_index]
  File "/home/gpu18/workspace/SimVG/simvg/datasets/base.py", line 70, in __getitem__
    results = self.pipeline(results)
  File "/home/gpu18/workspace/SimVG/simvg/datasets/pipelines/compose.py", line 22, in __call__
    results = transform(results)
  File "/home/gpu18/workspace/SimVG/simvg/datasets/pipelines/loading.py", line 272, in __call__
    results = self._load_expression_tokenize_beit3(results)
  File "/home/gpu18/workspace/SimVG/simvg/datasets/pipelines/loading.py", line 162, in _load_expression_tokenize_beit3
    expression = expressions[self.random_ind]
KeyError: 1

During the training process of the RefCOCO dataset, the following error will occur.
File "/home/XXXXX/SimVG-main/simvg/apis/train.py", line 49, in train_model for batch, inputs in enumerate(loader): File "/usr/local/python3.10.12/lib/python3.10/site-packages/torch/utils/data/dataloader.py", line 630, in next data = self._next_data() File "/usr/local/python3.10.12/lib/python3.10/site-packages/torch/utils/data/dataloader.py", line 673, in _next_data data = self._dataset_fetcher.fetch(index) # may raise StopIteration File "/usr/local/python3.10.12/lib/python3.10/site-packages/torch/utils/data/_utils/fetch.py", line 52, in fetch data = [self.dataset[idx] for idx in possibly_batched_index] File "/usr/local/python3.10.12/lib/python3.10/site-packages/torch/utils/data/_utils/fetch.py", line 52, in data = [self.dataset[idx] for idx in possibly_batched_index] File "/home/XXXXX/SimVG-main/simvg/datasets/base.py", line 70, in getitem results = self.pipeline(results) File "/home/XXXXX/SimVG-main/simvg/datasets/pipelines/compose.py", line 22, in call results = transform(results) File "/home/XXXXX/SimVG-main/simvg/datasets/pipelines/loading.py", line 275, in call results = self._load_expression_tokenize_beit3(results) File "/home/XXXXX/SimVG-main/simvg/datasets/pipelines/loading.py", line 162, in _load_expression_tokenize_beit3 expression = expressions[self.random_ind] KeyError: 0

I have update the grefcoco dataset link.
https://seunic-my.sharepoint.cn/:f:/g/personal/230238525_seu_edu_cn/EiX51qGWa9BBlt3fVRwgPhsBUxOIZ-yW3Hm7VXOQ3c2Ipw?e=M12MM6
plz re-download the grefcoco dataset and pull the newest version of the code.


[6.0.1] Dependent Input Field loses focus

I try to use dependent fields (field2 depends of the value of field1) so I wrote a snippet
const Form = () =>
  <form>
    <Field name={'field1'} component="input" type="text" />
    <Field name={'field1'}
        component={field => <Field name={'field2'} component="input" type="text" /> } />
  </form>

const Test = reduxForm({form: 'test'})(Form)

Field2 input loses the focus when I write in a first symbol, after input works fine
Here it is a screen

UPD: The same when I try to use <Fields/> as a wrapper

I have the same probelm 👍

Duplicate of https://github.com/erikras/redux-form/issues/1094
<Field name={'field1'}
component={field => <Field name={'field2'} component="input" type="text" /> } />
This is heavily discouraged.

@JakeLin1024  I want to refer a value of a field from another one. (For example show the second field only when the first is filled). What is the idiomatic way to do this?

Have you considered using Fields?

@Sir4ur0n : yes, it's the same - actual problem is  using inline arrow functions in component
@JakeLin1024 : Thanks, after reading https://github.com/erikras/redux-form/releases/tag/v6.0.0-alpha.14
I rewrote the code with external rendering
const depebdentInput = (field) => <Field name={'field2'} component="input" type="text" />
const Form = () =>
  <form>
    <Field name={'field1'} component="input" type="text" />
    <Field names={'field1'} component={depebdentInput} />
  </form>

Works fine now.

👍  Thanks @sbondaryev ! This bit me recently.


Correct formulae

Pull Request Test Coverage Report for Build<PHONE_NUMBER>3
Details

0 of 0   changed or added relevant lines in 0 files are covered.
17 unchanged lines in 1 file lost coverage.
Overall coverage remained the same at 92.683%

Files with Coverage Reduction
New Missed Lines
%

linear_elasticity.py
17
86.18%

Totals

Change from base Build<PHONE_NUMBER>3:
0.0%

Covered Lines:
342

Relevant Lines:
369

💛  - Coveralls


Improve parameter type resolving

Currently the types are resolved by comparing the summary with a predefined set of patterns. We should check if there is a better and more reliable possibility to get the types.
#22

#20


[Question] Build clusters depending on some geographical entity

Clusters are built purely with an algorithm. In many cases clustering markers depending on a given geographical entity is better (country, administrative region, zipcode, city, whatever).
People are familiar with such entities, and it avoids putting clusters in locations that don't feel 'natural'.
We developed a map where both algorithmical and 'geographical' approaches are used (depending on the zoom level) : https://thefoodassembly.com/

So we are both using Leaflet.markercluster and our own cluster logic. They are totally separated, which is a disadvantage because our own clusters don't benefit from Leaflet.markercluster animations, automatically created clickable polygons, and so on.
So my question is :
Would Leaflet.markercluster benefit from such a feature, or do you consider it out of scope?
I'll be doing a refacto of our codebase anyways so I got three options :

fork Leaflet.markercluster, do a PR with this geographical logic;
fork Leaflet.markercluster in a separate 'Leaflet.geomarkercluster' project;
build a separate 'Leaflet.geomarkercluster' project with a dependency to Leaflet.markercluster.

Would love some thoughts before coding any further :)

I feel we had another Issue or PR about something similar lately, but I can't find it.
Recently I wanted to use MarkerCluster with a different implementation of L.DistanceGrid, which turned out to be quite hard.
I would be interested to see how this works, I suspect it would be done by replacing L.DistanceGrid for these?
https://github.com/Leaflet/Leaflet.markercluster/blob/master/src/MarkerClusterGroup.js#L765-L766
It could be good to make replacing this easier, then we could have a geographic (attribute based cluster) cluster implementation of it?

Your map looks fantastic, and this feature would be a great addition to Leaflet.markercluster.
I was actually searching for exactly this for our student organisation, and wondering how I was going to go about it. Ideally, the home address of students in a particular university would be grouped into one university/city-cluster, which in turn would be clustered into country.
I hope you do it! :)
Ps. I do not understand the colour coding. At first I thought it depended on which day the food assembly was open, but that wasn't it.

Thanks :)
Each food assembly has "theme" which gives them a little bit of identity, and the colored markers simply reflect that.
I'm trying to find the time to have a serious look at that, but I can't give you a date.
You should be able to hack a solution yourself in the meantime, just use regular markers for marker clusters, put them on a distinct layer which you'll show/hide depending on the zoom level. The most tedious part is to have to manually set clickable polygons to interact with the "false clusters".

Hi nerik.
Congratulations for the solution you implemented, I like it very much.
I ran into this because I am looking for a solution which clusterizes just points which are on the same exact position.  I would be interested in investigating your solution of clusters based on geographical entity in order to grab some good ideas for my project.
Would it be possible to have more details? thanks a lot

Good Work nerik,  I am impressed on the same.
I like the idea that the cluster markers feel to be placed central to the geographical location.
Would it be possible to have more details? thanks a lot

A workaround that may work for some people is to display a dfferent set of markers depending on the zoom level. This would then mean not using the markercluster.
See http://jsfiddle.net/td2nyan4/1/
The example shows that the marker will show the country marker on high level, then universities, and when clicking on Berlin you'll be zoomed in on the city level and see the specific address markers.

Hi all,
I am also interested in this kind of functionality.
I may be wrong, but it seems to me that if somehow we could nest instances of MarkerClusterGroup, we could easily build a hierarchical tree. Each level would cluster only the children that have themselves clustered to 1 object.
The assignment of markers is then delegated to the application, which can very well decide to assign markers based on their geographical containment in administrative areas (e.g. towns, countys, States, countries and so on, as seems to be needed by @nerik), or whatever criteria (e.g. clients assigned to a regional office, who might not be distributed following a truly fixed geographical rule), hence it is not bound to any predefined rule.
We could even force the clustering of a lower level below certain zoom levels, in order to directly display all countries for example. Otherwise, (geographically) smaller ones could be down to 1 object and may already start clustering each other, whereas big countries would still have several town clusters...
With this kind of solution, it would be quite easy to style every hierarchical level differently (cluster graphism, clustering rules - radius, etc.), or even each branch differently (e.g. one style per country), as this would require only styling a given instance of MarkerClusterGroup.
Now I do not know yet if such a technique would make sense, as it would require dozens of MarkerClusterGroups. What would be the performance cost?
I will try to make up a quick demo later and post it here.

Hi all,
I do not know if many of you are still interested in this, but here is a demo of nesting Marker Cluster Groups in a hierarchical tree: http://ghybs.github.io/Leaflet.markercluster/hierarchical-tree-of-groups/
It shows USA > States > Counties > Cities (not displayed initially, because it takes a few dozen seconds to compute them; just update the map with the bottom left panel options if you are ready to wait for the processing)
The base data is quite heavy (~5MiB uncompressed, for 30k+ data points), so you may have to wait a few moments before the data is displayed the first time. I apologize, next time I will choose a less data-intensive example.
Cheers!

Looks impressive! I haven't had time to look at the code-behind, but this can be very useful. I think in most cases there will not be that many data points, although performance is always a question.

Hi,
I'm watching this issue for a while now since we want to do kind of the same thing with leaflet - region/area based clustering. With country boundaries as polygons I feel like a step closer, since I just need to do the following now:

get the latlng of a marker
check which boundary may include it
add it into a cluster with these bounds

But important question is: How can I implement my own clustering function? Had a look at the markercluster source but I got lost - so if someone can give me a hint I would be glad!

Hi,
What exactly are you trying to achieve? What do you mean by implementing your own clustering function?
If you do not need your country top cluster to cluster with other sibling country clusters, then you could simply create one MCG per country. Since you assign yourself the markers to the appropriate country MCG, they will cluster only with markers within the same MCG, hence from the same country.
If you also want the cluster to split into all its individual markers in one click, simply use the disableClusteringAtZoom option.
But if you DO want sibling country clusters to merge together once they have collected all their children markers, this is a big step in complexity. I achieved this in my above demo, but I am still wondering how to generalize this code in a robust way, and whether this should be a separate plugin or if it can be embedded in MCG code, as it is mainly modifying the core functions to support more cases.
Hope this helps.

Closing, example provided by ghybs shows how to implement this outside of L.MarkerCluster

@nerik Hi Nerik,
Do you mind share you source code. I am working on a similar problem and would love to learn something from you did! Thanks!

Hi @ghybs
I really need this functionality, but your demo is not available, do you mind sharing it again ?
Thanks in advance :)

Hi @kavinsky-,
Hum I am afraid I accidentally deleted the branch a few days ago unfortunately… T_T
I might have a local copy somewhere on an external drive, I will see if I can find it in the next days.
But to be honest, even though the demo was functional, it required highly modifying the code of Leaflet.markercluster about everywhere, so it was kind of bound to that particular version, which is quite old now (I think it was still on Leaflet 0.7).
I think it should be possible to do a better job, especially in turning it into a plugin, but that would certainly require quite some time to re-engineer it.
Sorry I cannot help you right now…

Hi,
Is there any option to achieve the following protoype.
Country > States > Counties > Cities

Have searched a lot, and most answers linked back to this post.
But  @ghybs demo did not exist longer, and I can't find core code in @nerik example site.
So can someone give an example about how to clusters based on defined polygon, i.e. cities or countries?

I found it at:
https://web.archive.org/web/20170516152119/http://ghybs.github.io:80/Leaflet.markercluster/hierarchical-tree-of-groups/


ANGULAR: JSON input gives extra fields in drop down

When e load a JSON into Angular, there appears to be some non functional fields appearing in the drop down. (below)

This does not appear when you load the same file into DEV

There's a function that gets called that adds on Race/Exposure details even when there's nothing of the sort in the data.  It has been removed.  Will check in the meeting to see why this might have been needed.


Add support for nwk output, rearrange some variables

CDPH asked for nwk outputs. This update adds them.
Some variables had their names shifted a bit to make them easier to view alphabetically.

Tested and passes locally.


ec_deployment_extension download fails with redirects

Readiness Checklist

[x] I am running the latest version
[x] I checked the documentation and found no answer
[x] I checked to make sure that this issue has not already been filed
[x] I am reporting the issue to the correct repository (for multi-repository projects)

Expected Behavior

When using the ec_deployment_extension and referencing a package from github packages, it should follow any redirects and download the package.
Current Behavior

When referencing a new extension from github packages to be used in a deployment, because of the nature of github, it will redirect the link to download to a static user endpoint URL instead which is dynamically created on the initial GET request.
As a result of this, when using the resource, it fails as it complains that the HTTP response code is a 302, rather than following the links through and getting the package through.
Error message is as follows from an attempted apply with terraform
│ Error: api error: 1 error occurred:
│ 	* extensions.request_execution_failed: Errors: [Cannot download from [https://github.com/medcl/elasticsearch-analysis-stconvert/releases/download/v8.7.0/elasticsearch-analysis-stconvert-8.7.0.zip]. Received HTTP response code [302]]
│

## Terraform definition

resource "ec_deployment_extension" "stconvert_plugin" {
  name           = "analysis-stconvert"
  version        = "8.7.0"
  extension_type = "bundle"
  download_url   = "https://github.com/medcl/elasticsearch-analysis-stconvert/releases/download/v8.7.0/elasticsearch-analysis-stconvert-8.7.0.zip"
}

Steps to Reproduce

Setup a new cluster creation, and reference the deployment extension above
Try and apply
See the error given back.
Curl to the package from your local, with verbose enabled and see how the redirect occurs.

Context

This means some additional steps to download the package, upload it to a static site (s3 bucket) and reference it from there instead.
Possible Solution

Allow the resource to follow redirects in order to download the package completely
Your Environment

Version used: 0.7.0
Running against Elastic Cloud SaaS or Elastic Cloud Enterprise and version: Elastic Cloud SaaS
Environment name and version (e.g. Go 1.9): N/A (Cloud)
Server type and version: N/A
Operating System and version: N/A (Terraform 1.3.4)
Link to your project: It's a private repo within our org, can duplicate code if needed.

This is a limitation of the underlying Cloud API. The provider does support uploading a local file, so there's no requirement to upload it to a static site.


Fix cloc error:

remote: error: GH006: Protected branch update failed for refs/heads/main.
remote: error: Changes must be made through a pull request.
To https://github.com/iacopy/cleanpython
 ! [remote rejected] main -> main (protected branch hook declined)
error: failed to push some refs to 'https://github.com/iacopy/cleanpython'

Basandomi su https://github.com/iacopy/Vocaboland/issues/103#issue-1912888901
Proviamo ad aggiungere:
  env:
    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

The error was fixed just by removing this rule: "Require a pull request before merging".


Added Error message for wrong File index

Codecov Report

Merging #228 (2de17da) into master (7834673) will decrease coverage by 0.08%.
The diff coverage is 33.33%.

:mega: This organization is not using Codecov’s GitHub App Integration. We recommend you install it so Codecov can continue to function properly for your repositories. Learn more
@@             Coverage Diff              @@
##             master     #228      +/-   ##
============================================
- Coverage     47.93%   47.86%   -0.08%
  Complexity      510      510
============================================
  Files           113      113
  Lines          2687     2691       +4
  Branches        281      283       +2
============================================
  Hits           1288     1288
- Misses         1321     1325       +4
  Partials         78       78

Impacted Files
Coverage Δ

...main/java/seedu/address/commons/core/Messages.java
0.00% <ø> (ø)

...rc/main/java/seedu/address/files/FilesManager.java
29.41% <ø> (+0.28%)
:arrow_up:

...eedu/address/logic/commands/DeleteFileCommand.java
0.00% <0.00%> (ø)

.../seedu/address/logic/commands/ViewFileCommand.java
0.00% <0.00%> (ø)

...c/main/java/seedu/address/files/FileGenerator.java
95.00% <100.00%> (+0.12%)
:arrow_up:

... and 1 file with indirect coverage changes
Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.


error LNK2001 when build on windows with --config=dynamic_kernels

Please make sure that this is a build/installation issue. As per our GitHub Policy, we only address code/doc bugs, performance issues, feature requests and build/installation issues on GitHub. tag:build_template
System information

OS Platform and Distribution: Windows 10 19044.1415
TensorFlow installed from: source
TensorFlow version: master
Python version: 3.9.7
Installed using: conda
Bazel version: 4.2.2
GCC/Compiler version: msvc 19.29.30038.1
CUDA/cuDNN version: cuda 11.1, cudnn 8.2.1
GPU model and memory: GTX 1080TI 11G

Describe the problem
I'm trying to compile tensorflow with "--config=dynamic_kernels" so I can use custom op. What I did:

Following https://www.tensorflow.org/install/source_windows?hl=zh-cn except using anaconda python
Edit .bazelrc and replace "build:windows --config=monolithic" with "build:windows --config=dynamic_kernels"
run "bazel build //tensorflow/tools/pip_package:build_pip_package --config=avx2_win"
When building goes into link stage I got a lot of  LNK2001 error.

Any other info / logs
build-log.txt

The document which you are following has some old versions, please follow this document which has the steps with the latest version and let us know if the problem still persists. Thanks!

Ok, so the only difference i found is the step "Install Python and the TensorFlow package dependencies"
I followed the newest document and I got exactly same errors.