@basemaps/cli 6.22.1 → 6.24.1

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/CHANGELOG.md CHANGED
@@ -3,6 +3,36 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [6.24.1](https://github.com/linz/basemaps/compare/v6.24.0...v6.24.1) (2022-04-07)
7
+
8
+ **Note:** Version bump only for package @basemaps/cli
9
+
10
+
11
+
12
+
13
+
14
+ # [6.24.0](https://github.com/linz/basemaps/compare/v6.23.0...v6.24.0) (2022-04-05)
15
+
16
+
17
+ ### Bug Fixes
18
+
19
+ * **cli:** create instance of EPSG code if not already defined ([#2141](https://github.com/linz/basemaps/issues/2141)) ([9e7b508](https://github.com/linz/basemaps/commit/9e7b508a70aa85f80b88a29501a08c249c9617af))
20
+
21
+
22
+
23
+
24
+
25
+ # [6.23.0](https://github.com/linz/basemaps/compare/v6.22.1...v6.23.0) (2022-04-04)
26
+
27
+
28
+ ### Features
29
+
30
+ * **shared:** load projections from the internet when not defined locally ([#2132](https://github.com/linz/basemaps/issues/2132)) ([85ac59f](https://github.com/linz/basemaps/commit/85ac59f771c3233f163a0223459faece46073847))
31
+
32
+
33
+
34
+
35
+
6
36
  ## [6.22.1](https://github.com/linz/basemaps/compare/v6.22.0...v6.22.1) (2022-03-23)
7
37
 
8
38
 
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=projection.loader.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection.loader.test.d.ts","sourceRoot":"","sources":["../../../src/cog/__test__/projection.loader.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ import o from 'ospec';
2
+ import { ProjectionLoader } from '../projection.loader.js';
3
+ import sinon from 'sinon';
4
+ import { Nztm2000 } from '@basemaps/shared/build/proj/nztm2000.js';
5
+ import { Epsg } from '@basemaps/geo';
6
+ import { Projection } from '@basemaps/shared';
7
+ o.spec('ProjectionLoader', () => {
8
+ const sandbox = sinon.createSandbox();
9
+ o.afterEach(() => sandbox.restore());
10
+ o('should not load if already loaded', async () => {
11
+ const fetchStub = sandbox.stub(ProjectionLoader, '_fetch');
12
+ const res = await ProjectionLoader.load(2193);
13
+ o(fetchStub.callCount).equals(0);
14
+ o(res.code).equals(2193);
15
+ });
16
+ o('should fetch data from the internet', async () => {
17
+ const fetchStub = sandbox
18
+ .stub(ProjectionLoader, '_fetch')
19
+ .resolves({ ok: true, text: () => Promise.resolve(Nztm2000) });
20
+ const res = await ProjectionLoader.load(3790);
21
+ o(fetchStub.callCount).equals(1);
22
+ o(res.code).equals(3790);
23
+ o(Epsg.get(3790)).equals(res);
24
+ o(Projection.get(3790).epsg).equals(res);
25
+ });
26
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/cog/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,IAAI,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAyC,OAAO,EAAc,MAAM,kBAAkB,CAAC;AAC9F,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAuB,MAAM,iBAAiB,CAAC;AAG/D,OAAe,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAGhD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEhE,eAAO,MAAM,qBAAqB,QAAQ,CAAC;AAC3C,eAAO,MAAM,YAAY,OAAO,CAAC;AACjC,eAAO,MAAM,WAAW,aAAa,CAAC;AAEtC;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAO/D;AAED,qBAAa,UAAU;IACrB,CAAC,EAAE,aAAa,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,aAAa,CAAC;IACzB,OAAO,CAAC,EAAE,IAAI,CAAC;IAGf,kBAAkB,cAAqB;IAEvC;;OAEG;gBACS,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,IAAI;IAO1F;;;OAGG;IACG,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC;IAoF7D,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAuBnC;;;;OAIG;IACH,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI;IAaxC,wFAAwF;YAC1E,WAAW;IA2BzB;;;;OAIG;IACG,KAAK,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAWjF"}
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/cog/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,IAAI,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAyC,OAAO,EAAc,MAAM,kBAAkB,CAAC;AAC9F,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAuB,MAAM,iBAAiB,CAAC;AAG/D,OAAe,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAGhD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEhE,eAAO,MAAM,qBAAqB,QAAQ,CAAC;AAC3C,eAAO,MAAM,YAAY,OAAO,CAAC;AACjC,eAAO,MAAM,WAAW,aAAa,CAAC;AAEtC;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAO/D;AAED,qBAAa,UAAU;IACrB,CAAC,EAAE,aAAa,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,aAAa,CAAC;IACzB,OAAO,CAAC,EAAE,IAAI,CAAC;IAGf,kBAAkB,cAAqB;IAEvC;;OAEG;gBACS,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,IAAI;IAO1F;;;OAGG;IACG,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC;IAoF7D,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAuBnC;;;;OAIG;IACH,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI;IAaxC,wFAAwF;YAC1E,WAAW;IA2BzB;;;;OAIG;IACG,KAAK,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAajF"}
@@ -6,6 +6,7 @@ import { existsSync, mkdirSync } from 'fs';
6
6
  import pLimit from 'p-limit';
7
7
  import * as path from 'path';
8
8
  import { basename } from 'path';
9
+ import { ProjectionLoader } from './projection.loader.js';
9
10
  export const InvalidProjectionCode = 32767;
10
11
  export const CacheVersion = 'v3'; // bump this number to invalidate the cache
11
12
  export const CacheFolder = './.cache';
@@ -119,10 +120,11 @@ export class CogBuilder {
119
120
  };
120
121
  }
121
122
  findProjection(tiff) {
123
+ var _a;
122
124
  const image = tiff.getImage(0);
123
125
  const projection = image.valueGeo(TiffTagGeo.ProjectedCSTypeGeoKey);
124
126
  if (projection != null && projection !== InvalidProjectionCode) {
125
- return Epsg.get(projection);
127
+ return (_a = Epsg.tryGet(projection)) !== null && _a !== void 0 ? _a : new Epsg(projection);
126
128
  }
127
129
  const imgWkt = image.value(TiffTag.GeoAsciiParams);
128
130
  const epsg = guessProjection(imgWkt);
@@ -179,6 +181,8 @@ export class CogBuilder {
179
181
  */
180
182
  async build(tiffs, cutline) {
181
183
  const metadata = await this.getMetadata(tiffs);
184
+ // Ensure that the projection definition is loaded
185
+ await ProjectionLoader.load(metadata.projection);
182
186
  const files = cutline.optimizeCovering(metadata);
183
187
  let union = null;
184
188
  for (const bounds of files) {
@@ -1 +1 @@
1
- {"version":3,"file":"cog.stac.job.d.ts","sourceRoot":"","sources":["../../src/cog/cog.stac.job.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,IAAI,EAKJ,aAAa,EAEd,MAAM,eAAe,CAAC;AACvB,OAAO,EAEL,UAAU,EACV,cAAc,EAKf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,YAAY,EAA8C,MAAM,iBAAiB,CAAC;AAE3F,OAAO,EAA0B,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAE1F,OAAO,EACL,kBAAkB,EAClB,MAAM,EACN,UAAU,EACV,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,EACzB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC,MAAM,WAAW,kBAAkB;IACjC,oBAAoB;IACpB,cAAc,EAAE,UAAU,GAAG,cAAc,CAAC;IAE5C,oBAAoB;IACpB,cAAc,EAAE,UAAU,CAAC;IAE3B,6CAA6C;IAC7C,OAAO,CAAC,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IAEF,UAAU,EAAE,aAAa,CAAC;IAE1B,QAAQ,CAAC,EAAE;QACT,sBAAsB;QACtB,EAAE,CAAC,EAAE,MAAM,CAAC;QAEZ;;;WAGG;QACH,OAAO,CAAC,EAAE,MAAM,CAAC;QAEjB;;;WAGG;QACH,WAAW,CAAC,EAAE,MAAM,CAAC;QAErB;;WAEG;QACH,UAAU,CAAC,EAAE,IAAI,CAAC;QAElB;;;WAGG;QACH,UAAU,CAAC,EAAE,wBAAwB,CAAC;KACvC,CAAC;IAEF;;;OAGG;IACH,KAAK,EAAE,OAAO,CAAC;IAEf,0FAA0F;IAC1F,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,gCAAgC;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,0BAA0B;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,mCAAmC;IACnC,GAAG,EAAE,kBAAkB,CAAC;IACxB,oDAAoD;IACpD,WAAW,EAAE,YAAY,CAAC;IAC1B,qCAAqC;IACrC,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,UAAW,YAAW,MAAM;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,CAAC,eAAe,CAAC,CAGtB;IAEF;;;;SAIK;WACQ,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAIvD;;;;SAIK;WACQ,MAAM,CAAC,EAClB,EAAE,EACF,WAAW,EACX,QAAQ,EACR,GAAG,EACH,WAAW,EACX,QAAQ,GACT,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC;IAmM3C;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,GAAG,wBAAwB;gBAS9D,IAAI,EAAE,UAAU;IAI5B,IAAI,EAAE,IAAI,MAAM,CAEf;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,IAAI,WAAW,IAAI,MAAM,GAAG,SAAS,CAEpC;IAED,IAAI,MAAM,IAAI,mBAAmB,CAEhC;IAED,IAAI,MAAM,IAAI,mBAAmB,CAEhC;IAED,IAAI,UAAU,IAAI,aAAa,CAO9B;IAED,IAAI,UAAU,IAAI,MAAM,CAMvB;IAED;;;;OAIG;IACH,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM;CAOjC"}
1
+ {"version":3,"file":"cog.stac.job.d.ts","sourceRoot":"","sources":["../../src/cog/cog.stac.job.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,IAAI,EAKJ,aAAa,EAEd,MAAM,eAAe,CAAC;AACvB,OAAO,EAEL,UAAU,EACV,cAAc,EAKf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,YAAY,EAA8C,MAAM,iBAAiB,CAAC;AAE3F,OAAO,EAA0B,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAG1F,OAAO,EACL,kBAAkB,EAClB,MAAM,EACN,UAAU,EACV,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,EACzB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC,MAAM,WAAW,kBAAkB;IACjC,oBAAoB;IACpB,cAAc,EAAE,UAAU,GAAG,cAAc,CAAC;IAE5C,oBAAoB;IACpB,cAAc,EAAE,UAAU,CAAC;IAE3B,6CAA6C;IAC7C,OAAO,CAAC,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IAEF,UAAU,EAAE,aAAa,CAAC;IAE1B,QAAQ,CAAC,EAAE;QACT,sBAAsB;QACtB,EAAE,CAAC,EAAE,MAAM,CAAC;QAEZ;;;WAGG;QACH,OAAO,CAAC,EAAE,MAAM,CAAC;QAEjB;;;WAGG;QACH,WAAW,CAAC,EAAE,MAAM,CAAC;QAErB;;WAEG;QACH,UAAU,CAAC,EAAE,IAAI,CAAC;QAElB;;;WAGG;QACH,UAAU,CAAC,EAAE,wBAAwB,CAAC;KACvC,CAAC;IAEF;;;OAGG;IACH,KAAK,EAAE,OAAO,CAAC;IAEf,0FAA0F;IAC1F,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,gCAAgC;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,0BAA0B;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,mCAAmC;IACnC,GAAG,EAAE,kBAAkB,CAAC;IACxB,oDAAoD;IACpD,WAAW,EAAE,YAAY,CAAC;IAC1B,qCAAqC;IACrC,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,UAAW,YAAW,MAAM;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,CAAC,eAAe,CAAC,CAGtB;IAEF;;;;SAIK;WACQ,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAMvD;;;;SAIK;WACQ,MAAM,CAAC,EAClB,EAAE,EACF,WAAW,EACX,QAAQ,EACR,GAAG,EACH,WAAW,EACX,QAAQ,GACT,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC;IAoM3C;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,GAAG,wBAAwB;gBAS9D,IAAI,EAAE,UAAU;IAI5B,IAAI,EAAE,IAAI,MAAM,CAEf;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,IAAI,WAAW,IAAI,MAAM,GAAG,SAAS,CAEpC;IAED,IAAI,MAAM,IAAI,mBAAmB,CAEhC;IAED,IAAI,MAAM,IAAI,mBAAmB,CAEhC;IAED,IAAI,UAAU,IAAI,aAAa,CAO9B;IAED,IAAI,UAAU,IAAI,MAAM,CAMvB;IAED;;;;OAIG;IACH,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM;CAOjC"}
@@ -3,6 +3,7 @@ import { extractYearRangeFromName, Projection, fsa, titleizeImageryName, Composi
3
3
  import { toFeatureCollection, toFeatureMultiPolygon } from '@linzjs/geojson';
4
4
  import { CliInfo } from '../cli/base.cli.js';
5
5
  import { GdalCogBuilderDefaults } from '../gdal/gdal.config.js';
6
+ import { ProjectionLoader } from './projection.loader.js';
6
7
  import { CogStacItemExtensions, CogStacKeywords } from './stac.js';
7
8
  export const MaxConcurrencyDefault = 50;
8
9
  /**
@@ -18,7 +19,9 @@ export class CogStacJob {
18
19
  * @param jobpath where to load the job.json from
19
20
  */
20
21
  static async load(jobpath) {
21
- return new CogStacJob(await fsa.readJson(jobpath));
22
+ const job = new CogStacJob(await fsa.readJson(jobpath));
23
+ await ProjectionLoader.load(job.source.epsg);
24
+ return job;
22
25
  }
23
26
  /**
24
27
  * Create job.json, collection.json, source.geojson, covering.geojson, cutlint.geojson.gz and
@@ -72,6 +75,7 @@ export class CogStacJob {
72
75
  if (description == null) {
73
76
  description = 'No description';
74
77
  }
78
+ await ProjectionLoader.load(metadata.projection);
75
79
  const job = new CogStacJob({
76
80
  id,
77
81
  name: imageryName,
@@ -0,0 +1,13 @@
1
+ import { Epsg } from '@basemaps/geo';
2
+ import fetch from 'node-fetch';
3
+ export declare class ProjectionLoader {
4
+ static _fetch: typeof fetch;
5
+ /**
6
+ * Ensure that a projection EPSG code is avialable for use in Proj4js
7
+ *
8
+ * If its not already loaded, lookup definition from spatialreference.org
9
+ * @param code
10
+ */
11
+ static load(code: number): Promise<Epsg>;
12
+ }
13
+ //# sourceMappingURL=projection.loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection.loader.d.ts","sourceRoot":"","sources":["../../src/cog/projection.loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,OAAO,KAAK,MAAM,YAAY,CAAC;AAE/B,qBAAa,gBAAgB;IAE3B,MAAM,CAAC,MAAM,eAAS;IAEtB;;;;;OAKG;WACU,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAc/C"}
@@ -0,0 +1,27 @@
1
+ import { Epsg } from '@basemaps/geo';
2
+ import { Projection } from '@basemaps/shared';
3
+ import fetch from 'node-fetch';
4
+ export class ProjectionLoader {
5
+ /**
6
+ * Ensure that a projection EPSG code is avialable for use in Proj4js
7
+ *
8
+ * If its not already loaded, lookup definition from spatialreference.org
9
+ * @param code
10
+ */
11
+ static async load(code) {
12
+ if (Projection.tryGet(code) != null)
13
+ return Epsg.get(code);
14
+ const url = `https://spatialreference.org/ref/epsg/${code}/ogcwkt/`;
15
+ const res = await this._fetch(url);
16
+ if (!res.ok)
17
+ throw new Error('Failed to load projection information for:' + code);
18
+ let epsg = Epsg.tryGet(code);
19
+ if (epsg == null)
20
+ epsg = new Epsg(code);
21
+ const text = await res.text();
22
+ Projection.define(epsg, text);
23
+ return epsg;
24
+ }
25
+ }
26
+ // Exposed for testing
27
+ ProjectionLoader._fetch = fetch;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@basemaps/cli",
3
- "version": "6.22.1",
3
+ "version": "6.24.1",
4
4
  "private": false,
5
5
  "repository": {
6
6
  "type": "git",
@@ -39,12 +39,13 @@
39
39
  "dependencies": {
40
40
  "@basemaps/config": "^6.21.1",
41
41
  "@basemaps/geo": "^6.21.1",
42
- "@basemaps/shared": "^6.22.0",
42
+ "@basemaps/shared": "^6.24.1",
43
43
  "@chunkd/fs": "^8.1.0",
44
- "@cogeotiff/core": "^6.1.1",
44
+ "@cogeotiff/core": "^7.0.0",
45
45
  "@linzjs/geojson": "^6.21.1",
46
46
  "@rushstack/ts-command-line": "^4.3.13",
47
47
  "ansi-colors": "^4.1.1",
48
+ "node-fetch": "^3.2.3",
48
49
  "p-limit": "^4.0.0",
49
50
  "pretty-json-log": "^1.0.0",
50
51
  "zod": "^3.2.0"
@@ -59,5 +60,5 @@
59
60
  "files": [
60
61
  "build/"
61
62
  ],
62
- "gitHead": "3190b6a49a91b3220b429a736484a93f3b76c721"
63
+ "gitHead": "034afcc7087bbe9041098d54e1529d757a70bb29"
63
64
  }