@eeacms/volto-arcgis-block 0.1.461 → 0.1.463

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.env CHANGED
@@ -1,3 +1 @@
1
- # Jest configuration variables
2
- # - possible values: ON, OFF
3
- JEST_USE_SETUP=OFF
1
+ JEST_USE_SETUP=OFF # Jest configuration variables: ON, OFF
@@ -0,0 +1,133 @@
1
+ name: Betterleaks
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ jobs:
11
+ scan:
12
+ name: Scan for secrets
13
+ runs-on: ubuntu-latest
14
+ env:
15
+ SMTP_URL: ${{ secrets.SMTP_URL }}
16
+ SMTP_PORT: ${{ secrets.SMTP_PORT || '25' }}
17
+ SMTP_EMAIL: ${{ secrets.SMTP_EMAIL }}
18
+ SMTP_PASSWORD: ${{ secrets.SMTP_PASSWORD }}
19
+ steps:
20
+ - name: Checkout repository
21
+ uses: actions/checkout@v4
22
+ with:
23
+ fetch-depth: 1
24
+ ref: ${{ github.event.pull_request.head.sha || github.sha }}
25
+
26
+ - name: Run Betterleaks
27
+ id: betterleaks
28
+ continue-on-error: true
29
+ uses: dortort/betterleaks-action@v0.1.0
30
+ with:
31
+ github-token: ${{ secrets.GITHUB_TOKEN }}
32
+ scan-mode: dir
33
+ scan-path: .
34
+ config: .gitleaks.toml
35
+ report-format: json
36
+ report-path: betterleaks-report.json
37
+ redact: "true"
38
+ no-color: "true"
39
+ no-banner: "true"
40
+ fail-on-leak: "true"
41
+
42
+ - name: Upload Betterleaks report
43
+ if: always()
44
+ uses: actions/upload-artifact@v4
45
+ with:
46
+ name: betterleaks-report
47
+ path: betterleaks-report.json
48
+ if-no-files-found: ignore
49
+
50
+ - name: Build Betterleaks email summary
51
+ id: leak_summary
52
+ if: steps.betterleaks.outcome == 'failure'
53
+ shell: bash
54
+ run: |
55
+ if [[ -s betterleaks-report.json ]]; then
56
+ jq -r '
57
+ def one_line:
58
+ tostring
59
+ | gsub("[\r\n]+"; " ")
60
+ | if length > 240 then .[0:240] + "..." else . end;
61
+
62
+ .[:20][]
63
+ | "- " + (.RuleID // "unknown-rule")
64
+ + " at " + (.File // "unknown-file")
65
+ + ":" + ((.StartLine // 0) | tostring)
66
+ + "\n match: " + ((.Match // .Secret // "REDACTED") | one_line)
67
+ ' betterleaks-report.json > betterleaks-email-summary.txt
68
+
69
+ count="$(jq 'length' betterleaks-report.json)"
70
+ if (( count > 20 )); then
71
+ {
72
+ echo ""
73
+ echo "... and $((count - 20)) more finding(s). Download the artifact for full details."
74
+ } >> betterleaks-email-summary.txt
75
+ fi
76
+ else
77
+ echo "No JSON report was generated. Download the workflow logs for details." > betterleaks-email-summary.txt
78
+ fi
79
+
80
+ {
81
+ echo "text<<BETTERLEAKS_SUMMARY"
82
+ cat betterleaks-email-summary.txt
83
+ echo "BETTERLEAKS_SUMMARY"
84
+ } >> "$GITHUB_OUTPUT"
85
+
86
+ - name: Resolve committer email
87
+ id: committer
88
+ if: steps.betterleaks.outcome == 'failure'
89
+ shell: bash
90
+ run: |
91
+ committer_email="$(git log -1 --format='%ce')"
92
+ author_email="$(git log -1 --format='%ae')"
93
+ email="$committer_email"
94
+ if [[ -z "$email" || "$email" == *"noreply.github.com"* ]]; then
95
+ email="$author_email"
96
+ fi
97
+ if [[ "$email" =~ ^[^[:space:]@]+@[^[:space:]@]+\.[^[:space:]@]+$ && "$email" != *"noreply.github.com"* ]]; then
98
+ echo "email=$email" >> "$GITHUB_OUTPUT"
99
+ else
100
+ echo "No deliverable committer email found; skipping Betterleaks email notification."
101
+ echo "email=" >> "$GITHUB_OUTPUT"
102
+ fi
103
+
104
+ - name: Email committer on Betterleaks failure
105
+ if: steps.betterleaks.outcome == 'failure' && steps.committer.outputs.email != '' && env.SMTP_URL != '' && env.SMTP_EMAIL != ''
106
+ uses: dawidd6/action-send-mail@v18
107
+ with:
108
+ server_address: ${{ env.SMTP_URL }}
109
+ server_port: ${{ env.SMTP_PORT }}
110
+ secure: ${{ env.SMTP_PORT == '465' }}
111
+ username: ${{ env.SMTP_EMAIL }}
112
+ password: ${{ env.SMTP_PASSWORD }}
113
+ from: ${{ env.SMTP_EMAIL }}
114
+ to: ${{ steps.committer.outputs.email }}
115
+ subject: "[Betterleaks] Secret scan failed in ${{ github.repository }}"
116
+ body: |
117
+ Betterleaks detected one or more potential secrets.
118
+
119
+ Repository: ${{ github.repository }}
120
+ Branch: ${{ github.ref_name }}
121
+ Commit: ${{ github.sha }}
122
+ Workflow run: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
123
+
124
+ Findings:
125
+ ${{ steps.leak_summary.outputs.text }}
126
+
127
+ Download the betterleaks-report artifact from the workflow run for details.
128
+
129
+ - name: Fail if Betterleaks found leaks
130
+ if: steps.betterleaks.outcome == 'failure'
131
+ run: |
132
+ echo "Betterleaks detected one or more secrets. Download the betterleaks-report artifact from this workflow run for details."
133
+ exit 1
@@ -0,0 +1,43 @@
1
+ name: OpenSSF Scorecard
2
+
3
+ on:
4
+ branch_protection_rule:
5
+ schedule:
6
+ - cron: '30 1 * * 6'
7
+ push:
8
+ branches: ["master"]
9
+ workflow_dispatch:
10
+
11
+ permissions: read-all
12
+
13
+ jobs:
14
+ analysis:
15
+ name: Scorecard analysis
16
+ runs-on: ubuntu-latest
17
+ permissions:
18
+ security-events: write
19
+ id-token: write
20
+ steps:
21
+ - name: "Checkout code"
22
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
23
+ with:
24
+ persist-credentials: false
25
+
26
+ - name: "Run analysis"
27
+ uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3
28
+ with:
29
+ results_file: results.sarif
30
+ results_format: sarif
31
+ publish_results: true
32
+
33
+ - name: "Upload artifact"
34
+ uses: actions/upload-artifact@v4
35
+ with:
36
+ name: SARIF-scorecard
37
+ path: results.sarif
38
+ retention-days: 5
39
+
40
+ - name: "Upload to code-scanning"
41
+ uses: github/codeql-action/upload-sarif@v3
42
+ with:
43
+ sarif_file: results.sarif
@@ -0,0 +1,38 @@
1
+ name: Semgrep SAST
2
+
3
+ on:
4
+ push:
5
+ branches: ["master"]
6
+ pull_request:
7
+ schedule:
8
+ - cron: '0 6 * * 1'
9
+ workflow_dispatch:
10
+
11
+ permissions:
12
+ security-events: write
13
+ contents: read
14
+
15
+ jobs:
16
+ semgrep:
17
+ name: Semgrep scan
18
+ runs-on: ubuntu-latest
19
+ steps:
20
+ - name: Checkout code
21
+ uses: actions/checkout@v4
22
+ with:
23
+ persist-credentials: false
24
+
25
+ - name: Install Semgrep
26
+ run: pip install semgrep
27
+
28
+ - name: Run Semgrep
29
+ run: |
30
+ semgrep scan --config p/javascript --config p/react --config p/security-audit --config p/secrets \
31
+ --sarif --output semgrep.sarif \
32
+ --error || true
33
+
34
+ - name: Upload SARIF to GitHub Code Scanning
35
+ uses: github/codeql-action/upload-sarif@v3
36
+ if: always()
37
+ with:
38
+ sarif_file: semgrep.sarif
package/.gitleaks.toml ADDED
@@ -0,0 +1,89 @@
1
+ title = "Betterleaks config"
2
+
3
+ [extend]
4
+ useDefault = true
5
+
6
+ [[rules]]
7
+ id = "secret-literal-assignment"
8
+ description = "Secret-like literal assignment in source, YAML, env and config files"
9
+ regex = '''(?i)([A-Za-z0-9_.-]*(?:password|passwd|pwd|api[_-]?key|apikey|access[_-]?key|secret[_-]?access[_-]?key|private[_-]?key|client[_-]?secret|consumer[_-]?key|consumer[_-]?secret|(?:auth|access|refresh|session|api|bearer|id|jwt|csrf|xsrf|oauth)[_-]?token|translate[_-]?auth|translation[_-]?auth|auth[_-]?password|auth[_-]?key|auth[_-]?credentials|database[_-]?url|connection[_-]?string)[A-Za-z0-9_.-]*)[ \t]*[:=][ \t]*["'']?([^"''[:space:]#{}$.][^"''\n#{}]{2,})["'']?'''
10
+ secretGroup = 2
11
+ keywords = [
12
+ "password",
13
+ "passwd",
14
+ "pwd",
15
+ "api_key",
16
+ "apikey",
17
+ "access_key",
18
+ "private_key",
19
+ "client_secret",
20
+ "consumer_key",
21
+ "consumer_secret",
22
+ "auth_token",
23
+ "access_token",
24
+ "refresh_token",
25
+ "session_token",
26
+ "api_token",
27
+ "bearer_token",
28
+ "id_token",
29
+ "jwt_token",
30
+ "csrf_token",
31
+ "xsrf_token",
32
+ "oauth_token",
33
+ "translate_auth",
34
+ "translation_auth",
35
+ "auth_password",
36
+ "auth_key",
37
+ "auth_credentials",
38
+ "database_url",
39
+ "connection_string"
40
+ ]
41
+ tags = ["literal-secret"]
42
+
43
+ [[rules]]
44
+ id = "env-short-secret-assignment"
45
+ description = "Uppercase env-style PASS/TOKEN/SECRET assignment"
46
+ regex = '''\b((?:PASS|TOKEN|SECRET|[A-Z0-9_]*(?:_PASS|_TOKEN|_SECRET|PASS_|TOKEN_|SECRET_)[A-Z0-9_]*))[ \t]*[:=][ \t]*["'']?([^"''[:space:]#{}$.][^"''\n#{}]{2,})["'']?'''
47
+ secretGroup = 2
48
+ keywords = [
49
+ "PASS",
50
+ "TOKEN",
51
+ "SECRET"
52
+ ]
53
+ tags = ["env", "literal-secret"]
54
+
55
+ [[rules]]
56
+ id = "standalone-sk-token"
57
+ description = "Standalone sk-* token not attached to a secret-like variable name"
58
+ regex = '''(?i)\b(sk-[A-Za-z0-9][A-Za-z0-9_-]{20,})\b'''
59
+ secretGroup = 1
60
+ entropy = 2.5
61
+ keywords = ["sk-"]
62
+ tags = ["standalone-token", "generic"]
63
+
64
+ [[rules]]
65
+ id = "dotenv-only-jest-setup"
66
+ description = ".env may only contain the committed Jest setup lines"
67
+ path = '''(?i)(^|/)\.env$'''
68
+ regex = '''(?m)^(.+)$'''
69
+ secretGroup = 1
70
+ tags = ["file", "dotenv"]
71
+ [[rules.allowlists]]
72
+ regexTarget = "match"
73
+ regexes = [
74
+ '''^JEST_USE_SETUP=OFF # Jest configuration variables: ON, OFF\r?$''',
75
+ ]
76
+
77
+ [[rules]]
78
+ id = "forbidden-secret-file"
79
+ description = "Forbidden secret-bearing file committed to repository"
80
+ path = '''(?i)(^|/)(\.env\..*|\.npmrc|\.pypirc|id_rsa|id_ed25519|.*\.(pem|key|p12|pfx|jks|kubeconfig))$'''
81
+ regex = '''(?s).{1,}'''
82
+ tags = ["file", "secret-file"]
83
+
84
+ [[allowlists]]
85
+ description = "Allow Jenkins SonarQube token environment variable reference"
86
+ regexTarget = "match"
87
+ regexes = [
88
+ '''SONAR_AUTH_TOKEN''',
89
+ ]
package/CHANGELOG.md CHANGED
@@ -4,6 +4,20 @@ All notable changes to this project will be documented in this file. Dates are d
4
4
 
5
5
  Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
6
6
 
7
+ ### [0.1.463](https://github.com/eea/volto-arcgis-block/compare/0.1.462...0.1.463) - 16 July 2026
8
+
9
+ ### [0.1.462](https://github.com/eea/volto-arcgis-block/compare/0.1.461...0.1.462) - 14 July 2026
10
+
11
+ #### :bug: Bug Fixes
12
+
13
+ - fix: Add betterleaks github action - refs #304517 [dobri1408 - [`708109a`](https://github.com/eea/volto-arcgis-block/commit/708109a97a7a5bbefb816b694672594079e5845c)]
14
+
15
+ #### :hammer_and_wrench: Others
16
+
17
+ - ci: fix Semgrep workflow — use CLI with SARIF output [anton16 - [`d116408`](https://github.com/eea/volto-arcgis-block/commit/d1164086caed81549559ef617d504b248d148c81)]
18
+ - ci: add Semgrep SAST workflow [anton16 - [`d242b5c`](https://github.com/eea/volto-arcgis-block/commit/d242b5cee00b7a3d37fad292a2524e3ef6477281)]
19
+ - ci: add OpenSSF Scorecard workflow [anton16 - [`217ca11`](https://github.com/eea/volto-arcgis-block/commit/217ca11071e68aaf9183d058f49d928d8add7fac)]
20
+ - test: pin Chromium version 149 to work with Cypress [valentinab25 - [`9a729f9`](https://github.com/eea/volto-arcgis-block/commit/9a729f9fc40ddcbfed74ea8a18572e59f49be08f)]
7
21
  ### [0.1.461](https://github.com/eea/volto-arcgis-block/compare/0.1.460...0.1.461) - 2 July 2026
8
22
 
9
23
  ### [0.1.460](https://github.com/eea/volto-arcgis-block/compare/0.1.459...0.1.460) - 2 July 2026
package/Dockerfile CHANGED
@@ -1,13 +1,47 @@
1
1
  # syntax=docker/dockerfile:1
2
2
  ARG VOLTO_VERSION
3
- FROM eeacms/frontend-builder:${VOLTO_VERSION}
3
+ FROM plone/frontend-builder:${VOLTO_VERSION}
4
4
 
5
5
  ARG ADDON_NAME
6
6
  ARG ADDON_PATH
7
+ ARG CHROMIUM_VERSION=149.0.7827.196-1~deb12u1
8
+
9
+
10
+ ENV HOST="0.0.0.0"
11
+ ENV CHROME_BIN="/usr/bin/chromium"
12
+ ENV CHROMIUM_BIN="/usr/bin/chromium"
13
+ ENV CYPRESS_BROWSER_PATH="/usr/bin/chromium"
14
+
15
+ # Install Cypress dependencies (matching eeacms/frontend-builder)
16
+ USER root
17
+ RUN apt-get update -q \
18
+ && apt-get install -qy --no-install-recommends \
19
+ libgtk2.0-0 libgtk-3-0 libgbm-dev libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 libxtst6 xauth xvfb \
20
+ && rm -rf /var/lib/apt/lists/*
21
+
22
+ RUN set -eux; \
23
+ mkdir -p /etc/apt/sources.list.d /etc/apt/preferences.d /etc/apt/apt.conf.d; \
24
+ printf '%s\n' \
25
+ 'Acquire::Check-Valid-Until "false";' \
26
+ > /etc/apt/apt.conf.d/99snapshot-no-check-valid-until; \
27
+ printf '%s\n' \
28
+ 'deb [check-valid-until=no] http://snapshot.debian.org/archive/debian-security/20260630T000000Z bookworm-security main' \
29
+ 'deb [check-valid-until=no] http://snapshot.debian.org/archive/debian/20260630T000000Z bookworm main' \
30
+ > /etc/apt/sources.list.d/bookworm-chromium149-snapshot.list; \
31
+ apt-get update -q; \
32
+ apt-get install -qy --no-install-recommends \
33
+ "chromium=${CHROMIUM_VERSION}" \
34
+ "chromium-common=${CHROMIUM_VERSION}" \
35
+ ; \
36
+ apt-mark hold chromium chromium-common ; \
37
+ rm -rf /var/lib/apt/lists/*
38
+
39
+ USER node
7
40
 
8
41
  COPY --chown=node:node ./ /app/src/addons/${ADDON_PATH}/
9
42
 
10
43
  RUN /setupAddon
44
+ RUN yarn add jest-junit
11
45
  RUN yarn install
12
46
 
13
47
  ENTRYPOINT ["yarn"]
package/README.md CHANGED
@@ -119,7 +119,7 @@ Release-it is a tool that automates 4 important steps in the release process:
119
119
  To configure the authentification, you need to export GITHUB_TOKEN for [GitHub](https://github.com/settings/tokens)
120
120
 
121
121
  ```
122
- export GITHUB_TOKEN=XXX-XXXXXXXXXXXXXXXXXXXXXX
122
+ export GITHUB_TOKEN="${GITHUB_TOKEN}"
123
123
  ```
124
124
 
125
125
  To configure npm, you can use the `npm login` command or use a configuration file with a TOKEN :
@@ -163,3 +163,62 @@ Generic command, does not automatically add the `beta` to version, but you can s
163
163
 
164
164
  See [DEVELOP.md](https://github.com/eea/volto-arcgis-block/blob/master/DEVELOP.md).
165
165
 
166
+ ## Secret Scanning
167
+
168
+ This repository uses the Betterleaks GitHub Action to scan the current
169
+ repository content on every push and pull request. The scan uses the rules in
170
+ `.gitleaks.toml` and uploads a `betterleaks-report` artifact when a finding is
171
+ detected.
172
+
173
+ If the optional SMTP secrets are configured, failed scans also send an email to
174
+ the last commit committer. The workflow expects these repository or
175
+ organization secrets:
176
+
177
+ - `SMTP_URL`
178
+ - `SMTP_PORT` (optional, defaults to `25`)
179
+ - `SMTP_EMAIL`
180
+ - `SMTP_PASSWORD` (optional if the SMTP server does not require authentication)
181
+
182
+ Port `465` is sent with direct TLS; other ports use the default SMTP handshake.
183
+ The email includes a short finding summary from the redacted Betterleaks report,
184
+ including the redacted matched line from each finding.
185
+
186
+ There are three common outcomes:
187
+
188
+ 1. **Everything is OK.** The `Betterleaks / Scan for secrets` check is green and
189
+ no action is needed. Regular references to runtime values are OK, for example:
190
+
191
+ ```js
192
+ const tokenFromCookie = req.universalCookies.get('auth_token');
193
+ ```
194
+
195
+ 2. **A real secret was found.** The check is red and the workflow log asks you to
196
+ download the `betterleaks-report` artifact. Open the artifact from the GitHub
197
+ Actions run and check the reported file, line and rule. Remove the committed
198
+ value, move it to the proper secret store, and rotate it if it was exposed.
199
+ A report entry looks like this:
200
+
201
+ ```json
202
+ {
203
+ "RuleID": "secret-literal-assignment",
204
+ "File": "src/config.js",
205
+ "StartLine": 12,
206
+ "Secret": "[REDACTED]"
207
+ }
208
+ ```
209
+
210
+ 3. **The finding is a false positive.** Keep the value only if it is clearly not
211
+ sensitive, such as a test fixture, placeholder, or public example. Add
212
+ `betterleaks:allow` on the same line and include a short explanation in the
213
+ pull request.
214
+
215
+ ```js
216
+ const testPassword = 'admin'; //betterleaks:allow
217
+ ```
218
+
219
+ ```yaml
220
+ password: "admin" #betterleaks:allow
221
+ ```
222
+
223
+ Do not add `betterleaks:allow` to real credentials.
224
+
package/RELEASE.md CHANGED
@@ -33,7 +33,7 @@ Release-it is a tool that automates 4 important steps in the release process:
33
33
  To configure the authentification, you need to export GITHUB_TOKEN for [GitHub](https://github.com/settings/tokens)
34
34
 
35
35
  ```
36
- export GITHUB_TOKEN=XXX-XXXXXXXXXXXXXXXXXXXXXX
36
+ export GITHUB_TOKEN="${GITHUB_TOKEN}"
37
37
  ```
38
38
 
39
39
  To configure npm, you can use the `npm login` command or use a configuration file with a TOKEN :
@@ -5,14 +5,14 @@ Cypress.Commands.add('autologin', () => {
5
5
  let api_url, user, password;
6
6
  api_url = Cypress.env('API_PATH') || 'http://localhost:8080/Plone';
7
7
  user = 'admin';
8
- password = 'admin';
8
+ password = 'admin'; //betterleaks:allow
9
9
 
10
10
  return cy
11
11
  .request({
12
12
  method: 'POST',
13
13
  url: `${api_url}/@login`,
14
14
  headers: { Accept: 'application/json' },
15
- body: { login: user, password: password },
15
+ body: { login: user, password: password }, //betterleaks:allow
16
16
  })
17
17
  .then((response) => cy.setCookie('auth_token', response.body.token));
18
18
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eeacms/volto-arcgis-block",
3
- "version": "0.1.461",
3
+ "version": "0.1.463",
4
4
  "description": "volto-arcgis-block: Volto add-on",
5
5
  "main": "src/index.js",
6
6
  "author": "European Environment Agency: CodeSyntax",
@@ -852,7 +852,7 @@ class MenuWidget extends React.Component {
852
852
  this.zoomTooltips();
853
853
  // }
854
854
 
855
- let authToken = this.getAuthToken();
855
+ let authToken = this.getAuthToken(); //betterleaks:allow
856
856
  let timeSliderTag = sessionStorage.getItem('timeSliderTag');
857
857
  let downloadTag = sessionStorage.getItem('downloadButtonClicked');
858
858
  let checkedLayers = JSON.parse(sessionStorage.getItem('checkedLayers'));
@@ -2354,7 +2354,7 @@ class MenuWidget extends React.Component {
2354
2354
  });
2355
2355
  return `https://land.copernicus.eu/cdse/wms/${
2356
2356
  collectionMatch[1]
2357
- }?${legendParams.toString()}`;
2357
+ }?${legendParams.toString()}&WIDTH=500&HEIGHT=400`;
2358
2358
  }
2359
2359
 
2360
2360
  parseWMSLayers(xml) {
@@ -2625,8 +2625,24 @@ class MenuWidget extends React.Component {
2625
2625
  }
2626
2626
  const matrixData = wmtsContextData.matrixData || {};
2627
2627
  const linkData = wmtsContextData.linkData;
2628
- for (let index = 0; index < linkData.length; index += 1) {
2629
- const matrixId = linkData[index];
2628
+ const preferredMatrixData = [
2629
+ 'PopularWebMercator512',
2630
+ 'popularwebmercator512',
2631
+ 'PopularWebMercator256',
2632
+ 'popularwebmercator256',
2633
+ ];
2634
+ const orderedLinkData = [
2635
+ ...linkData
2636
+ .filter((matrixId) => preferredMatrixData.includes(matrixId))
2637
+ .sort(
2638
+ (firstData, secondData) =>
2639
+ preferredMatrixData.indexOf(firstData) -
2640
+ preferredMatrixData.indexOf(secondData),
2641
+ ),
2642
+ ...linkData.filter((matrixId) => !preferredMatrixData.includes(matrixId)),
2643
+ ];
2644
+ for (let index = 0; index < orderedLinkData.length; index += 1) {
2645
+ const matrixId = orderedLinkData[index];
2630
2646
  const matrixWkid = matrixData[matrixId];
2631
2647
  if (!matrixWkid) {
2632
2648
  continue;