Skip to content

Commit 990b897

Browse files
authored
Move existing-airgap-install regression tests to playwright (#5191)
* Move existing-airgap-install regression tests to playwright
1 parent d265ce5 commit 990b897

File tree

45 files changed

+1691
-435
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+1691
-435
lines changed

.github/workflows/build-test.yaml

Lines changed: 0 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -2430,25 +2430,6 @@ jobs:
24302430
replicated-api-token: '${{ secrets.C11Y_MATRIX_TOKEN }}'
24312431
kots-dockerhub-username: '${{ secrets.E2E_DOCKERHUB_USERNAME }}'
24322432
kots-dockerhub-password: '${{ secrets.E2E_DOCKERHUB_PASSWORD }}'
2433-
2434-
- name: promote restrictive release
2435-
env:
2436-
REPLICATED_APP: min-kots-version
2437-
REPLICATED_API_TOKEN: ${{ secrets.C11Y_MATRIX_TOKEN }}
2438-
run: replicated release promote 7 24Z37fX3oWkM4LjYCiByrewT5oZ --version v1.0.1
2439-
- name: validate that kots install fails early
2440-
run: |
2441-
set +e
2442-
2443-
result=$(kubectl kots install "$APP_SLUG/automated" --no-port-forward --namespace "$APP_SLUG" --shared-password password 2>&1 >/dev/null)
2444-
echo "$result"
2445-
2446-
if [[ "$result" == *"requires"* ]] && [[ "$result" == *"10000.0.0"* ]]; then
2447-
exit 0
2448-
else
2449-
exit 1
2450-
fi
2451-
24522433
- name: Remove Cluster
24532434
id: remove-cluster
24542435
uses: replicatedhq/replicated-actions/remove-cluster@v1
@@ -2563,25 +2544,6 @@ jobs:
25632544
replicated-api-token: '${{ secrets.C11Y_MATRIX_TOKEN }}'
25642545
kots-dockerhub-username: '${{ secrets.E2E_DOCKERHUB_USERNAME }}'
25652546
kots-dockerhub-password: '${{ secrets.E2E_DOCKERHUB_PASSWORD }}'
2566-
2567-
- name: promote restrictive release
2568-
env:
2569-
REPLICATED_APP: target-kots-version
2570-
REPLICATED_API_TOKEN: ${{ secrets.C11Y_MATRIX_TOKEN }}
2571-
run: replicated release promote 7 24Z39v7whc7juc34k7ITiMtZxDy --version v1.0.1
2572-
- name: validate that kots install fails early
2573-
run: |
2574-
set +e
2575-
2576-
result=$(kubectl kots install target-kots-version/automated --no-port-forward --namespace target-kots-version --shared-password password 2>&1 >/dev/null)
2577-
echo "$result"
2578-
2579-
if [[ "$result" == *"requires"* ]] && [[ "$result" == *"1.0.0"* ]]; then
2580-
exit 0
2581-
else
2582-
exit 1
2583-
fi
2584-
25852547
- name: Remove Cluster
25862548
id: remove-cluster
25872549
uses: replicatedhq/replicated-actions/remove-cluster@v1
@@ -2694,25 +2656,6 @@ jobs:
26942656
replicated-api-token: '${{ secrets.C11Y_MATRIX_TOKEN }}'
26952657
kots-dockerhub-username: '${{ secrets.E2E_DOCKERHUB_USERNAME }}'
26962658
kots-dockerhub-password: '${{ secrets.E2E_DOCKERHUB_PASSWORD }}'
2697-
2698-
- name: promote restrictive release
2699-
env:
2700-
REPLICATED_APP: range-kots-version
2701-
REPLICATED_API_TOKEN: ${{ secrets.C11Y_MATRIX_TOKEN }}
2702-
run: replicated release promote 7 24Z39f0sNqo48VV9ZpLIUtlhHrN --version v1.0.1
2703-
- name: validate that kots install fails early
2704-
run: |
2705-
set +e
2706-
2707-
result=$(kubectl kots install range-kots-version/automated --no-port-forward --namespace range-kots-version --shared-password password 2>&1 >/dev/null)
2708-
echo "$result"
2709-
2710-
if [[ "$result" == *"requires"* ]] && [[ "$result" == *"11000.0.0"* ]]; then
2711-
exit 0
2712-
else
2713-
exit 1
2714-
fi
2715-
27162659
- name: Remove Cluster
27172660
id: remove-cluster
27182661
uses: replicatedhq/replicated-actions/remove-cluster@v1

.github/workflows/regression.yaml

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ jobs:
130130
working-directory: automation/jumpbox
131131
run: |
132132
export TF_VAR_expires_on="${{ needs.get-workspace-expiration.outputs.expiration }}"
133+
export TF_VAR_kots_branch="${{ github.ref_name }}"
133134
terraform apply --auto-approve
134135
135136
- name: Notify Slack
@@ -160,75 +161,88 @@ jobs:
160161
matrix:
161162
test: [
162163
{
164+
id: "embedded-airgapped-upgrade",
163165
name: "type=embedded cluster, env=airgapped, phase=upgraded install, rbac=cluster admin",
164166
backend_config: "embedded-airgapped-upgrade-backend-config.tfvars",
165167
terraform_script: "embedded-airgapped-upgrade.sh",
166168
is_upgrade: "1"
167169
},
168170
{
171+
id: "embedded-airgapped-install",
169172
name: "type=embedded cluster, env=airgapped, phase=new install, rbac=cluster admin",
170173
backend_config: "embedded-airgapped-install-backend-config.tfvars",
171174
terraform_script: "embedded-airgapped-install.sh"
172175
},
173176
{
177+
id: "embedded-online-install",
174178
name: "type=embedded cluster, env=online, phase=new install, rbac=cluster admin",
175179
backend_config: "embedded-online-install-backend-config.tfvars",
176180
terraform_script: "embedded-online-install.sh"
177181
},
178182
{
183+
id: "embedded-online-upgrade",
179184
name: "type=embedded cluster, env=online, phase=upgraded install, rbac=cluster admin",
180185
backend_config: "embedded-online-upgrade-backend-config.tfvars",
181186
terraform_script: "embedded-online-upgrade.sh",
182187
is_upgrade: "1"
183188
},
184189
{
190+
id: "existing-airgapped-install-admin",
185191
name: "type=existing cluster, env=airgapped, phase=new install, rbac=cluster admin",
186192
backend_config: "existing-airgapped-install-admin-backend-config.tfvars",
187193
terraform_script: "existing-airgapped-install-admin.sh"
188194
},
189195
{
196+
id: "existing-airgapped-install-minimum",
190197
name: "type=existing cluster, env=airgapped, phase=new install, rbac=minimal rbac",
191198
backend_config: "existing-airgapped-install-minimum-backend-config.tfvars",
192199
terraform_script: "existing-airgapped-install-minimum.sh"
193200
},
194201
{
202+
id: "existing-online-upgrade-admin",
195203
name: "type=existing cluster, env=online, phase=upgraded install, rbac=cluster admin",
196204
backend_config: "existing-online-upgrade-admin-backend-config.tfvars",
197205
terraform_script: "existing-online-upgrade-admin.sh",
198206
is_upgrade: "1"
199207
},
200208
{
209+
id: "existing-online-upgrade-minimum",
201210
name: "type=existing cluster, env=online, phase=upgraded install, rbac=minimal rbac",
202211
backend_config: "existing-online-upgrade-minimum-backend-config.tfvars",
203212
terraform_script: "existing-online-upgrade-minimum.sh",
204213
is_upgrade: "1"
205214
},
206215
{
216+
id: "existing-online-install-admin",
207217
name: "type=existing cluster, env=online, phase=new install, rbac=cluster admin",
208218
backend_config: "existing-online-install-admin-backend-config.tfvars",
209219
terraform_script: "existing-online-install-admin.sh"
210220
},
211221
{
222+
id: "existing-online-install-minimum",
212223
name: "type=existing cluster, env=online, phase=new install, rbac=minimal rbac",
213224
backend_config: "existing-online-install-minimum-backend-config.tfvars",
214225
terraform_script: "existing-online-install-minimum.sh"
215226
},
216227
{
228+
id: "existing-airgapped-upgrade-admin",
217229
name: "type=existing cluster, env=airgapped, phase=upgraded install, rbac=cluster admin",
218230
backend_config: "existing-airgapped-upgrade-admin-backend-config.tfvars",
219231
terraform_script: "existing-airgapped-upgrade-admin.sh",
220232
is_upgrade: "1"
221233
},
222234
{
235+
id: "existing-airgapped-upgrade-minimum",
223236
name: "type=existing cluster, env=airgapped, phase=upgraded install, rbac=minimal rbac",
224237
backend_config: "existing-airgapped-upgrade-minimum-backend-config.tfvars",
225238
terraform_script: "existing-airgapped-upgrade-minimum.sh",
226239
is_upgrade: "1"
227-
# },
228-
# {
229-
# name: "type=helmvm cluster, env=online, phase=new install, rbac=cluster admin",
230-
# backend_config: "helmvm-online-install-backend-config.tfvars",
231-
# terraform_script: "helmvm-online-install.sh"
240+
# },
241+
# {
242+
# id: "helmvm-online-install",
243+
# name: "type=helmvm cluster, env=online, phase=new install, rbac=cluster admin",
244+
# backend_config: "helmvm-online-install-backend-config.tfvars",
245+
# terraform_script: "helmvm-online-install.sh"
232246
}
233247
]
234248
steps:
@@ -268,7 +282,6 @@ jobs:
268282
fi
269283
export TF_VAR_kots_addon_package_url="${{ github.event.inputs.addon_package_url || inputs.addon_package_url }}"
270284
export TF_VAR_testim_branch="master"
271-
export TF_VAR_kots_branch="${{ github.ref_name }}"
272285
export TF_VAR_expires_on="${{ needs.get-workspace-expiration.outputs.expiration }}"
273286
./${{ matrix.test.terraform_script }} apply
274287
@@ -299,14 +312,14 @@ jobs:
299312
# Create tarball of playwright report on control plane
300313
ssh -i ssh.pem "ubuntu@$jumpbox_public_ip" \
301314
"ssh -t ubuntu@$control_plane_private_ip \
302-
'cd /home/ubuntu/kots/e2e/playwright && tar -czf /home/ubuntu/playwright-report.tar.gz playwright-report'"
315+
'cd /home/ubuntu/playwright && tar -czf /home/ubuntu/playwright-report.tar.gz playwright-report'"
303316
304317
# Copy tarball from control plane to jumpbox
305318
ssh -i ssh.pem "ubuntu@$jumpbox_public_ip" \
306-
"scp ubuntu@$control_plane_private_ip:/home/ubuntu/playwright-report.tar.gz /home/ubuntu/playwright-report.tar.gz"
319+
"scp ubuntu@$control_plane_private_ip:/home/ubuntu/playwright-report.tar.gz /home/ubuntu/${{ matrix.test.id }}-playwright-report.tar.gz"
307320
308321
# Copy tarball from jumpbox to local machine
309-
scp -i ssh.pem "ubuntu@$jumpbox_public_ip:/home/ubuntu/playwright-report.tar.gz" ./playwright-report.tar.gz
322+
scp -i ssh.pem "ubuntu@$jumpbox_public_ip:/home/ubuntu/${{ matrix.test.id }}-playwright-report.tar.gz" ./playwright-report.tar.gz
310323
311324
# Extract tarball
312325
tar -xzf ./playwright-report.tar.gz
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
apiVersion: kots.io/v1beta1
2+
kind: ConfigValues
3+
metadata:
4+
creationTimestamp: null
5+
name: qa-kots
6+
spec:
7+
values:
8+
a_bool:
9+
default: "0"
10+
value: "0"
11+
a_hidden_field: {}
12+
a_label: {}
13+
a_required_text:
14+
value: i want to update this field - wn38lG
15+
a_templated_label: {}
16+
a_templated_text:
17+
value: Av_up2vQiQZBod_2diZL_PTTlBJZBTe1FcWVGvCbhSRxG_tFDT2cNZbr0sqGtb13
18+
a_text: {}
19+
a_textarea: {}
20+
a_textarea_default:
21+
default: |
22+
My
23+
default
24+
text
25+
a_textarea_value:
26+
value: |
27+
My
28+
prepopulated
29+
text
30+
include_helm_chart:
31+
default: "0"
32+
value: "1"
33+
mysql_password:
34+
value: YJ210Au0vc662LmjxFCmPgosy0uua4RcIAtB2DHBGvp7dDiKlR5S8FOYpBjYqY28NUoLeeTXa3lFrrCIc072iBhobySlvWQ7He/kdwloO8izTbS2rpFV0Qgifjw=
35+
nginx_port:
36+
default: "80"
37+
pip_config: {}
38+
registry_endpoint_default_2:
39+
default: 10.96.1.218
40+
registry_endpoint_value_2:
41+
value: 10.96.1.218
42+
ro_gen_password:
43+
value: WoTG8lqpgauet76t73DRIissoFm/QtNROjJM+CbsPc1iZAGvyyF9s321YJW9pIf4YjO047X/hU4=
44+
ro_gen_password_default:
45+
default: n4gznPRwUKSZykkscx8opALVc6StqI3p_SXsXtrb
46+
rw_gen_password:
47+
value: ZYmozAymuZeP2aKrxE2qCw9gx0WuH9AJezNVyCmYCas2dD+AzGlSy1ikkl7buKOxOkpQff7UVXNhqLjURWCSgANHGA+CpWM8Wc3wd9w4sKxSAOF73sI7Hjpbb98=
48+
rw_gen_password_default:
49+
default: 9ccgvHdQhXun0qMPxUil7ADiVKzrRnmRkfCP23wr
50+
status: {}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
export const NAMESPACE = "qakotsregression";
2+
export const INITIAL_SMALL_BUNDLE_CHANNEL_SEQUENCE = 17;
3+
export const UPDATE_SMALL_BUNDLE_CHANNEL_SEQUENCE = 18;
4+
export const VENDOR_INITIAL_CHANNEL_SEQUENCE = 13;
5+
export const VENDOR_UPDATE_CHANNEL_SEQUENCE = 14;
6+
export const LICENSE_ID = "1riYWkuo5PdMtD4imgTYX699IdU";
7+
export const CUSTOMER_ID = "1riYWlpWEbuVSARQtZmZWZOv2TN";
8+
export const CUSTOMER_NAME = "type=existing cluster, env=airgapped, phase=new install, rbac=cluster admin";
9+
export const CHANNEL_NAME = "type=existing cluster, env=airgapped, phase=new install, rbac=cluster admin";
10+
export const CHANNEL_ID = "1riP4oQC5ZOaqciRwLf14I6yn2l";
11+
export const CHANNEL_SLUG = "type-existing-cluster-env-airg";
12+
export const VELERO_VERSION = "v1.12.1";
13+
export const VELERO_AWS_PLUGIN_VERSION = "v1.8.1";
14+
export const IS_EC = false;
15+
export const IS_EXISTING_CLUSTER = true;
16+
export const IS_AIRGAPPED = true;
17+
export const IS_AIRGAP_SUPPORTED = true;
18+
export const IS_MINIMAL_RBAC = false;
19+
export const DOWNLOAD_PORTAL_BASE64_PASSWORD = "SFJZQVlF";
20+
export const SHOULD_RESET_PASSWORD = false;
21+
export const IS_VELERO_INSTALLED = false;
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
apiVersion: kots.io/v1beta1
2+
kind: License
3+
metadata:
4+
name: typeexistingclusterenvairgappedphasenewinstallrbacclusteradmin
5+
spec:
6+
appSlug: qakotsregression
7+
channelID: 1riP4oQC5ZOaqciRwLf14I6yn2l
8+
channelName: type=existing cluster, env=airgapped, phase=new install, rbac=cluster
9+
admin
10+
customerName: type=existing cluster, env=airgapped, phase=new install, rbac=cluster
11+
admin
12+
endpoint: https://replicated.app
13+
entitlements:
14+
bool_field_1:
15+
title: Boolean Field 1
16+
value: true
17+
valueType: Boolean
18+
expires_at:
19+
description: License Expiration
20+
title: Expiration
21+
value: ""
22+
valueType: String
23+
hidden_field_1:
24+
isHidden: true
25+
title: Hidden Field 1
26+
value: hide me
27+
valueType: String
28+
int_field_1:
29+
title: Integer Field 1
30+
value: 123
31+
valueType: Integer
32+
required_field_1:
33+
title: Required Field 1
34+
value: require me
35+
valueType: String
36+
str_field_1:
37+
title: String Field 1
38+
value: abc
39+
valueType: String
40+
txt_field_1:
41+
title: Text Field 1
42+
value: |-
43+
abc
44+
xyz
45+
valueType: Text
46+
isAirgapSupported: true
47+
isGitOpsSupported: true
48+
isNewKotsUiEnabled: true
49+
isSnapshotSupported: true
50+
licenseID: 1riYWkuo5PdMtD4imgTYX699IdU
51+
licenseSequence: 7
52+
licenseType: prod
53+
signature: eyJsaWNlbnNlRGF0YSI6ImV5SmhjR2xXWlhKemFXOXVJam9pYTI5MGN5NXBieTkyTVdKbGRHRXhJaXdpYTJsdVpDSTZJa3hwWTJWdWMyVWlMQ0p0WlhSaFpHRjBZU0k2ZXlKdVlXMWxJam9pZEhsd1pXVjRhWE4wYVc1blkyeDFjM1JsY21WdWRtRnBjbWRoY0hCbFpIQm9ZWE5sYm1WM2FXNXpkR0ZzYkhKaVlXTmpiSFZ6ZEdWeVlXUnRhVzRpZlN3aWMzQmxZeUk2ZXlKc2FXTmxibk5sU1VRaU9pSXhjbWxaVjJ0MWJ6VlFaRTEwUkRScGJXZFVXVmcyT1RsSlpGVWlMQ0pzYVdObGJuTmxWSGx3WlNJNkluQnliMlFpTENKamRYTjBiMjFsY2s1aGJXVWlPaUowZVhCbFBXVjRhWE4wYVc1bklHTnNkWE4wWlhJc0lHVnVkajFoYVhKbllYQndaV1FzSUhCb1lYTmxQVzVsZHlCcGJuTjBZV3hzTENCeVltRmpQV05zZFhOMFpYSWdZV1J0YVc0aUxDSmhjSEJUYkhWbklqb2ljV0ZyYjNSemNtVm5jbVZ6YzJsdmJpSXNJbU5vWVc1dVpXeEpSQ0k2SWpGeWFWQTBiMUZETlZwUFlYRmphVkozVEdZeE5FazJlVzR5YkNJc0ltTm9ZVzV1Wld4T1lXMWxJam9pZEhsd1pUMWxlR2x6ZEdsdVp5QmpiSFZ6ZEdWeUxDQmxiblk5WVdseVoyRndjR1ZrTENCd2FHRnpaVDF1WlhjZ2FXNXpkR0ZzYkN3Z2NtSmhZejFqYkhWemRHVnlJR0ZrYldsdUlpd2liR2xqWlc1elpWTmxjWFZsYm1ObElqbzNMQ0psYm1Sd2IybHVkQ0k2SW1oMGRIQnpPaTh2Y21Wd2JHbGpZWFJsWkM1aGNIQWlMQ0psYm5ScGRHeGxiV1Z1ZEhNaU9uc2lZbTl2YkY5bWFXVnNaRjh4SWpwN0luUnBkR3hsSWpvaVFtOXZiR1ZoYmlCR2FXVnNaQ0F4SWl3aWRtRnNkV1VpT25SeWRXVXNJblpoYkhWbFZIbHdaU0k2SWtKdmIyeGxZVzRpZlN3aVpYaHdhWEpsYzE5aGRDSTZleUowYVhSc1pTSTZJa1Y0Y0dseVlYUnBiMjRpTENKa1pYTmpjbWx3ZEdsdmJpSTZJa3hwWTJWdWMyVWdSWGh3YVhKaGRHbHZiaUlzSW5aaGJIVmxJam9pSWl3aWRtRnNkV1ZVZVhCbElqb2lVM1J5YVc1bkluMHNJbWhwWkdSbGJsOW1hV1ZzWkY4eElqcDdJblJwZEd4bElqb2lTR2xrWkdWdUlFWnBaV3hrSURFaUxDSjJZV3gxWlNJNkltaHBaR1VnYldVaUxDSjJZV3gxWlZSNWNHVWlPaUpUZEhKcGJtY2lMQ0pwYzBocFpHUmxiaUk2ZEhKMVpYMHNJbWx1ZEY5bWFXVnNaRjh4SWpwN0luUnBkR3hsSWpvaVNXNTBaV2RsY2lCR2FXVnNaQ0F4SWl3aWRtRnNkV1VpT2pFeU15d2lkbUZzZFdWVWVYQmxJam9pU1c1MFpXZGxjaUo5TENKeVpYRjFhWEpsWkY5bWFXVnNaRjh4SWpwN0luUnBkR3hsSWpvaVVtVnhkV2x5WldRZ1JtbGxiR1FnTVNJc0luWmhiSFZsSWpvaWNtVnhkV2x5WlNCdFpTSXNJblpoYkhWbFZIbHdaU0k2SWxOMGNtbHVaeUo5TENKemRISmZabWxsYkdSZk1TSTZleUowYVhSc1pTSTZJbE4wY21sdVp5QkdhV1ZzWkNBeElpd2lkbUZzZFdVaU9pSmhZbU1pTENKMllXeDFaVlI1Y0dVaU9pSlRkSEpwYm1jaWZTd2lkSGgwWDJacFpXeGtYekVpT25zaWRHbDBiR1VpT2lKVVpYaDBJRVpwWld4a0lERWlMQ0oyWVd4MVpTSTZJbUZpWTF4dWVIbDZJaXdpZG1Gc2RXVlVlWEJsSWpvaVZHVjRkQ0o5ZlN3aWFYTkJhWEpuWVhCVGRYQndiM0owWldRaU9uUnlkV1VzSW1selIybDBUM0J6VTNWd2NHOXlkR1ZrSWpwMGNuVmxMQ0pwYzFOdVlYQnphRzkwVTNWd2NHOXlkR1ZrSWpwMGNuVmxMQ0pwYzA1bGQwdHZkSE5WYVVWdVlXSnNaV1FpT25SeWRXVjlmUT09IiwiaW5uZXJTaWduYXR1cmUiOiJleUpzYVdObGJuTmxVMmxuYm1GMGRYSmxJam9pWjBoWE1WbEJVMFF2WjNSWlVYRnRaVXhJTDNCaWFrZHJLMnMyUkdGNlZXeFNTemM0SzNCdFpqTm9ObVZ1Ums1M1lWSlJjME5tTjFnd2JYWkRUalZWZGxodlIySXlWbEZ6ZEdwd2NGQnlSamhEVUhKWFNXeERWSEF5WVhkV1RuUmhjRkJ2ZW05V2VtOUtWMDR5U1UxclprTnRiR1J5YTFGbFZVaDVUVmRMZVVacVdqZGlOREV4VGxkR1RHMTFlVEpvVEV4WFdFOVVlbFo0ZEcxNWExWm1aMGhPY2xobU5XWmpXVFkxZG1FM2MyNUtVbkJqTVVSamJGQk9NMnBpYkdaSE5FMUdNbkZqUnpORFZVRnBUbU5oWjBKV1ZsSjBZM2hJYjJkNmFpdHNLM1YxY0hoYVQxQklOVzVSYVZoaFJsUnVhVzFLVFVwUlRHNHpNemxKS3pkNlNVTnNLMnhyYkhBMk1VTmpaUzlyU2pSbGFESjBXVzE2YkU1aE1YTTBiamN3Y21sRldFTjZRM1UzU2xCWFpqTnZhbXc0Uld4dE1uUkpRbVZKWkhCNWNGTkZSVlE0V0drNGMwSjFWMFJ1Y0c5emFYTjFiMmRCUFQwaUxDSndkV0pzYVdOTFpYa2lPaUl0TFMwdExVSkZSMGxPSUZCVlFreEpReUJMUlZrdExTMHRMVnh1VFVsSlFrbHFRVTVDWjJ0eGFHdHBSemwzTUVKQlVVVkdRVUZQUTBGUk9FRk5TVWxDUTJkTFEwRlJSVUYxYkZWS2J5dEtkV2xFUm05bWRGQnpNWE4xYWx4dWFGZGtOMWxCUlhoeWNraHZaemRVYjJwRE1HVnhNWEJCYkZOWFJsRnhZbWxsZVdOdVVVRTRObXhXVURoSGNXa3hhMk55Tm1rMlRrRjBhM1JPVEZGalpseHVXV2xYUkhGTE1ESjJkbFUzYVhSbFZWcExaRk5rSzB0WVpsaFlUbXd4TWtscVRtczFiR1F2UkZWc01IaFNWWE5oTDBObVUzVlRTMmhpZDFNM01IcHJVMXh1TkUxQmEweHVabFJaUzNKdGMybGhNSGM0VFU1VFpXcEdVVzV3UjA1RmExWmxjMWxrWTI1aWVXWm5kbGxzU0hwcEszRXliRXRRU21jek5qa3lOMnBPU0Z4dVJXcDZSV3hOV21GcVIycEVORmMyYmxoUk0xWnVWbFl4V1Vkck1WcGpaRXBFYldZelMzRXlNRTVYZURKR2R6ZFZaVzE2WVcwMFVDOUdXRzV5YzBoRlRGeHVTWEZSTlhGa1JEQkRhbkZsUldJck1YVldOMDlwU1V4S2FFRkVkV0Z0VlZGNGFUaFdVM05PYzFodGVqbHNRVFZRUW1OV2NqUmFjSEJNVDFaak4yTkRkbHh1TkZGSlJFRlJRVUpjYmkwdExTMHRSVTVFSUZCVlFreEpReUJMUlZrdExTMHRMVnh1SWl3aWEyVjVVMmxuYm1GMGRYSmxJam9pWlhsS2VtRlhaSFZaV0ZJeFkyMVZhVTlwU2xWVmEyUmFWa2QwV1ZsVVJrcFdSRkpvV2xWMGNtUklhRU5oUkVKVldsZGFWbGRWTldsVVZFWlpaREJPV1ZWc2NFWkxlbEpJVTNwV2ExbFhPVWxaYkVVMVZqRnZkbFpITlZSaFZUaDVWakJrZWxGNlNtdFZiR1JYVGtWc1dVd3dVa3haTW1SaFlWVk9jMVJGTlUxVWJrNXdVVzVTY1ZwV1JrcFNNRW8xWVZkb1VVMXNWVE5pZWtVd1ZGVldWR0Z0ZUhOa1ZFSjZWbXMxVUZSVk9VTmxWekV3VGtSYU5GVklUbmhNTWtZelZWVnZORlZGV1RCWmVsb3daV3hTZVZGc1ZsbFZNRFIzV2xSU1RHRlZXWHBUUjJkM1dsVXhWMk5JV1RKVFZGbzJVVzFzYzJSSGFFZFNSVTVzWVVoQ1UyRlZXalpaVmtKelZGVXhOazB3YUZwVGJYaE1VakphYmxKRk5VdGlNR2cxWVRCemVXUkZielJoTUZveldrWldSMkpyU2s1aU1uaFJXV3RrYjJWcVdrbFBSa0l5VGxSa2QwNUhVa1ZYYkZaT1QwYzVSV0Y2YUZWa01EVk9VV3hhUldScmNFbE5hWE16Vkc1dk1tVlhOVlZrVm1zeldXcEtWR05FVlhsaVJURlVXVmhLYVZaclNrdE5NV3hNVDBVME1sSXhTWGRXYkVadlVrWldhV0pzUlRST1NGWjNVV3BTTlZaVVNuaFdia3BoWkRKYWQxRlVUbmhQVkZJeVVUSXdNMVpzWXpCaE0xSjFVbGhGZUdKVVJtbGhia1l3WTBVMWJWUldSVGxRVTBselNXMWtjMkl5U21oaVJYUnNaVlZzYTBscWIybFpiVkpzV2xSVk1rNVVXWGRaTWxwcFRrUk9hazlYU1hsUFIwcHRUMVJvYkZsWFRtaGFiVVV5VGtSWmFXWlJQVDBpZlE9PSJ9

0 commit comments

Comments
 (0)