@cogeotiff/core 6.1.1 → 7.0.0
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 +11 -0
- package/build/cog.tiff.d.ts +2 -2
- package/build/cog.tiff.d.ts.map +1 -1
- package/build/cog.tiff.image.d.ts +6 -7
- package/build/cog.tiff.image.d.ts.map +1 -1
- package/build/cog.tiff.image.js +31 -31
- package/build/cog.tiff.js +22 -50
- package/build/read/tag/__test__/tag.test.js +1 -1
- package/build/read/tag/tiff.tag.lazy.d.ts +1 -2
- package/build/read/tag/tiff.tag.lazy.d.ts.map +1 -1
- package/build/read/tag/tiff.tag.lazy.js +3 -3
- package/build/read/tag/tiff.tag.offset.d.ts +2 -3
- package/build/read/tag/tiff.tag.offset.d.ts.map +1 -1
- package/build/read/tag/tiff.tag.offset.js +5 -5
- package/package.json +4 -5
- package/src/cog.tiff.image.ts +29 -31
- package/src/cog.tiff.ts +20 -64
- package/src/read/tag/__test__/tag.test.ts +1 -1
- package/src/read/tag/tiff.tag.lazy.ts +2 -3
- package/src/read/tag/tiff.tag.offset.ts +4 -5
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,17 @@
|
|
|
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
|
+
# [7.0.0](https://github.com/blacha/cogeotiff/compare/v6.1.1...v7.0.0) (2022-03-17)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* **core:** upgrade chunkd and remove logger for internal fetches ([#832](https://github.com/blacha/cogeotiff/issues/832)) ([71bd740](https://github.com/blacha/cogeotiff/commit/71bd7409706e4a82e6a29b2a3fc0e8b25221e9fc))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
6
17
|
## [6.1.1](https://github.com/blacha/cogeotiff/compare/v6.1.0...v6.1.1) (2022-01-26)
|
|
7
18
|
|
|
8
19
|
|
package/build/cog.tiff.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ChunkSource
|
|
1
|
+
import { ChunkSource } from '@chunkd/core';
|
|
2
2
|
import { CogTiffImage } from './cog.tiff.image.js';
|
|
3
3
|
import { TiffVersion } from './const/tiff.version.js';
|
|
4
4
|
import { CogTifGhostOptions } from './read/tiff.gdal.js';
|
|
@@ -21,7 +21,7 @@ export declare class CogTiff {
|
|
|
21
21
|
*
|
|
22
22
|
* @param loadGeoKeys Whether to also initialize the GeoKeyDirectory
|
|
23
23
|
*/
|
|
24
|
-
init(loadGeoKeys?: boolean
|
|
24
|
+
init(loadGeoKeys?: boolean): Promise<CogTiff>;
|
|
25
25
|
private doInit;
|
|
26
26
|
private fetchIfd;
|
|
27
27
|
getImage(z: number): CogTiffImage;
|
package/build/cog.tiff.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cog.tiff.d.ts","sourceRoot":"","sources":["../src/cog.tiff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"cog.tiff.d.ts","sourceRoot":"","sources":["../src/cog.tiff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAmC,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAK3F,qBAAa,OAAO;IAChB,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,cAAoB;IAC3B,MAAM,EAAE,YAAY,EAAE,CAAM;IAC5B,OAAO,qBAA4B;IAEnC,OAAO,CAAC,MAAM,CAAkB;IAChC,SAAS,EAAE,aAAa,CAAiB;gBAE7B,MAAM,EAAE,WAAW;IAK/B,sCAAsC;IACtC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAIpD,6BAA6B;IAC7B,aAAa,UAAS;IAEtB,YAAY,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC;;;;OAIG;IACH,IAAI,CAAC,WAAW,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;YAM7B,MAAM;YAWN,QAAQ;IAkCtB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,YAAY;IAIjC;;;;OAIG;IACH,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY;IAoBtD;;;;;;;;OAQG;IACG,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,UAAU,CAAA;KAAE,GAAG,IAAI,CAAC;YAQ7F,UAAU;YASV,OAAO;IAqBrB,gDAAgD;IAC1C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { LogType } from '@chunkd/core';
|
|
2
1
|
import { CogTiff } from './cog.tiff.js';
|
|
3
2
|
import { TiffMimeType } from './const/tiff.mime.js';
|
|
4
3
|
import { TiffTag, TiffTagGeo } from './const/tiff.tag.id.js';
|
|
@@ -41,7 +40,7 @@ export declare class CogTiffImage {
|
|
|
41
40
|
*
|
|
42
41
|
* @param loadGeoTags Whether to load the GeoKeyDirectory and unpack it
|
|
43
42
|
*/
|
|
44
|
-
init(loadGeoTags?: boolean
|
|
43
|
+
init(loadGeoTags?: boolean): Promise<void>;
|
|
45
44
|
/**
|
|
46
45
|
* Get the value of a TiffTag if it exists null otherwise
|
|
47
46
|
*/
|
|
@@ -49,7 +48,7 @@ export declare class CogTiffImage {
|
|
|
49
48
|
/**
|
|
50
49
|
* Load and unpack the GeoKeyDirectory
|
|
51
50
|
*/
|
|
52
|
-
loadGeoTiffTags(
|
|
51
|
+
loadGeoTiffTags(): Promise<void>;
|
|
53
52
|
/**
|
|
54
53
|
* Get the associated GeoTiffTags
|
|
55
54
|
*/
|
|
@@ -58,7 +57,7 @@ export declare class CogTiffImage {
|
|
|
58
57
|
* Load a tag, if it is not currently loaded, fetch the required data for the tag.
|
|
59
58
|
* @param tag tag to fetch
|
|
60
59
|
*/
|
|
61
|
-
fetch<T>(tag: TiffTag
|
|
60
|
+
fetch<T>(tag: TiffTag): Promise<T | null>;
|
|
62
61
|
/**
|
|
63
62
|
* Get the origin point for the image
|
|
64
63
|
*
|
|
@@ -137,7 +136,7 @@ export declare class CogTiffImage {
|
|
|
137
136
|
* @param index tile index
|
|
138
137
|
* @returns file offset of the specified tile
|
|
139
138
|
*/
|
|
140
|
-
protected getTileOffset(index: number
|
|
139
|
+
protected getTileOffset(index: number): Promise<number>;
|
|
141
140
|
getTileBounds(x: number, y: number): BoundingBox;
|
|
142
141
|
/**
|
|
143
142
|
* Read a strip into a uint8 array
|
|
@@ -160,11 +159,11 @@ export declare class CogTiffImage {
|
|
|
160
159
|
* @param x Tile x offset
|
|
161
160
|
* @param y Tile y offset
|
|
162
161
|
*/
|
|
163
|
-
getTile(x: number, y: number
|
|
162
|
+
getTile(x: number, y: number): Promise<{
|
|
164
163
|
mimeType: TiffMimeType;
|
|
165
164
|
bytes: Uint8Array;
|
|
166
165
|
} | null>;
|
|
167
|
-
protected getTileSize(index: number
|
|
166
|
+
protected getTileSize(index: number): Promise<{
|
|
168
167
|
offset: number;
|
|
169
168
|
imageSize: number;
|
|
170
169
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cog.tiff.image.d.ts","sourceRoot":"","sources":["../src/cog.tiff.image.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"cog.tiff.image.d.ts","sourceRoot":"","sources":["../src/cog.tiff.image.ts"],"names":[],"mappings":"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"}
|
package/build/cog.tiff.image.js
CHANGED
|
@@ -19,25 +19,25 @@ export class CogTiffImage {
|
|
|
19
19
|
*
|
|
20
20
|
* @param loadGeoTags Whether to load the GeoKeyDirectory and unpack it
|
|
21
21
|
*/
|
|
22
|
-
async init(loadGeoTags = false
|
|
22
|
+
async init(loadGeoTags = false) {
|
|
23
23
|
const requiredTags = [
|
|
24
|
-
this.fetch(TiffTag.Compression
|
|
25
|
-
this.fetch(TiffTag.ImageHeight
|
|
26
|
-
this.fetch(TiffTag.ImageWidth
|
|
27
|
-
this.fetch(TiffTag.ModelPixelScale
|
|
28
|
-
this.fetch(TiffTag.ModelTiePoint
|
|
29
|
-
this.fetch(TiffTag.ModelTransformation
|
|
30
|
-
this.fetch(TiffTag.TileHeight
|
|
31
|
-
this.fetch(TiffTag.TileWidth
|
|
24
|
+
this.fetch(TiffTag.Compression),
|
|
25
|
+
this.fetch(TiffTag.ImageHeight),
|
|
26
|
+
this.fetch(TiffTag.ImageWidth),
|
|
27
|
+
this.fetch(TiffTag.ModelPixelScale),
|
|
28
|
+
this.fetch(TiffTag.ModelTiePoint),
|
|
29
|
+
this.fetch(TiffTag.ModelTransformation),
|
|
30
|
+
this.fetch(TiffTag.TileHeight),
|
|
31
|
+
this.fetch(TiffTag.TileWidth),
|
|
32
32
|
];
|
|
33
33
|
if (loadGeoTags) {
|
|
34
|
-
requiredTags.push(this.fetch(TiffTag.GeoKeyDirectory
|
|
35
|
-
requiredTags.push(this.fetch(TiffTag.GeoAsciiParams
|
|
36
|
-
requiredTags.push(this.fetch(TiffTag.GeoDoubleParams
|
|
34
|
+
requiredTags.push(this.fetch(TiffTag.GeoKeyDirectory));
|
|
35
|
+
requiredTags.push(this.fetch(TiffTag.GeoAsciiParams));
|
|
36
|
+
requiredTags.push(this.fetch(TiffTag.GeoDoubleParams));
|
|
37
37
|
}
|
|
38
38
|
await Promise.all(requiredTags);
|
|
39
39
|
if (loadGeoTags) {
|
|
40
|
-
await this.loadGeoTiffTags(
|
|
40
|
+
await this.loadGeoTiffTags();
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
43
|
/**
|
|
@@ -52,7 +52,7 @@ export class CogTiffImage {
|
|
|
52
52
|
/**
|
|
53
53
|
* Load and unpack the GeoKeyDirectory
|
|
54
54
|
*/
|
|
55
|
-
async loadGeoTiffTags(
|
|
55
|
+
async loadGeoTiffTags() {
|
|
56
56
|
// Already loaded
|
|
57
57
|
if (this.tagsGeoLoaded)
|
|
58
58
|
return;
|
|
@@ -64,9 +64,9 @@ export class CogTiffImage {
|
|
|
64
64
|
if (!sourceTag.isReady && sourceTag instanceof CogTiffTagLazy) {
|
|
65
65
|
// Load all the required keys
|
|
66
66
|
await Promise.all([
|
|
67
|
-
this.fetch(TiffTag.GeoKeyDirectory
|
|
68
|
-
this.fetch(TiffTag.GeoAsciiParams
|
|
69
|
-
this.fetch(TiffTag.GeoDoubleParams
|
|
67
|
+
this.fetch(TiffTag.GeoKeyDirectory),
|
|
68
|
+
this.fetch(TiffTag.GeoAsciiParams),
|
|
69
|
+
this.fetch(TiffTag.GeoDoubleParams),
|
|
70
70
|
]);
|
|
71
71
|
}
|
|
72
72
|
this.tagsGeoLoaded = true;
|
|
@@ -107,12 +107,12 @@ export class CogTiffImage {
|
|
|
107
107
|
* Load a tag, if it is not currently loaded, fetch the required data for the tag.
|
|
108
108
|
* @param tag tag to fetch
|
|
109
109
|
*/
|
|
110
|
-
async fetch(tag
|
|
110
|
+
async fetch(tag) {
|
|
111
111
|
const sourceTag = this.tags.get(tag);
|
|
112
112
|
if (sourceTag == null)
|
|
113
113
|
return null;
|
|
114
114
|
if (CogTiffTag.isLazy(sourceTag))
|
|
115
|
-
return sourceTag.fetch(
|
|
115
|
+
return sourceTag.fetch();
|
|
116
116
|
return sourceTag.value;
|
|
117
117
|
}
|
|
118
118
|
/**
|
|
@@ -287,13 +287,13 @@ export class CogTiffImage {
|
|
|
287
287
|
* @param index tile index
|
|
288
288
|
* @returns file offset of the specified tile
|
|
289
289
|
*/
|
|
290
|
-
async getTileOffset(index
|
|
290
|
+
async getTileOffset(index) {
|
|
291
291
|
const tileOffset = this.tileOffset;
|
|
292
292
|
if (index < 0 || index > tileOffset.dataCount) {
|
|
293
293
|
throw new Error(`Tile offset: ${index} out of range: 0 -> ${tileOffset.dataCount}`);
|
|
294
294
|
}
|
|
295
295
|
// Fetch only the part of the offsets that are needed
|
|
296
|
-
return tileOffset.getValueAt(index
|
|
296
|
+
return tileOffset.getValueAt(index);
|
|
297
297
|
}
|
|
298
298
|
// Clamp the bounds of the output image to the size of the image, as sometimes the edge tiles are not full tiles
|
|
299
299
|
getTileBounds(x, y) {
|
|
@@ -334,13 +334,13 @@ export class CogTiffImage {
|
|
|
334
334
|
return actualBytes;
|
|
335
335
|
}
|
|
336
336
|
/** Read image bytes at the given offset */
|
|
337
|
-
async getBytes(offset, byteCount
|
|
337
|
+
async getBytes(offset, byteCount) {
|
|
338
338
|
const mimeType = this.compression;
|
|
339
339
|
if (mimeType == null)
|
|
340
340
|
throw new Error('Unsupported compression: ' + this.value(TiffTag.Compression));
|
|
341
341
|
if (byteCount === 0)
|
|
342
342
|
return null;
|
|
343
|
-
await this.tif.source.loadBytes(offset, byteCount
|
|
343
|
+
await this.tif.source.loadBytes(offset, byteCount);
|
|
344
344
|
const bytes = this.tif.source.bytes(offset, byteCount);
|
|
345
345
|
if (this.compression === TiffMimeType.JPEG) {
|
|
346
346
|
return { mimeType, bytes: this.getJpegHeader(bytes) };
|
|
@@ -355,7 +355,7 @@ export class CogTiffImage {
|
|
|
355
355
|
* @param x Tile x offset
|
|
356
356
|
* @param y Tile y offset
|
|
357
357
|
*/
|
|
358
|
-
async getTile(x, y
|
|
358
|
+
async getTile(x, y) {
|
|
359
359
|
const mimeType = this.compression;
|
|
360
360
|
const size = this.size;
|
|
361
361
|
const tiles = this.tileSize;
|
|
@@ -373,29 +373,29 @@ export class CogTiffImage {
|
|
|
373
373
|
const totalTiles = nxTiles * nyTiles;
|
|
374
374
|
if (idx >= totalTiles)
|
|
375
375
|
throw new Error(`Tile index is outside of tile range: ${idx} >= ${totalTiles}`);
|
|
376
|
-
const { offset, imageSize } = await this.getTileSize(idx
|
|
377
|
-
return this.getBytes(offset, imageSize
|
|
376
|
+
const { offset, imageSize } = await this.getTileSize(idx);
|
|
377
|
+
return this.getBytes(offset, imageSize);
|
|
378
378
|
}
|
|
379
|
-
async getTileSize(index
|
|
379
|
+
async getTileSize(index) {
|
|
380
380
|
// GDAL optimizes tiles by storing the size of the tile in
|
|
381
381
|
// the few bytes leading up to the tile
|
|
382
382
|
if (this.tif.options.tileLeaderByteSize) {
|
|
383
|
-
const offset = await this.getTileOffset(index
|
|
383
|
+
const offset = await this.getTileOffset(index);
|
|
384
384
|
// Sparse COG no data found
|
|
385
385
|
if (offset === 0)
|
|
386
386
|
return { offset: 0, imageSize: 0 };
|
|
387
387
|
const leaderBytes = this.tif.options.tileLeaderByteSize;
|
|
388
388
|
// This fetch will generally load in the bytes needed for the image too
|
|
389
389
|
// provided the image size is less than the size of a chunk
|
|
390
|
-
await this.tif.source.loadBytes(offset - leaderBytes, leaderBytes
|
|
390
|
+
await this.tif.source.loadBytes(offset - leaderBytes, leaderBytes);
|
|
391
391
|
return { offset, imageSize: this.tif.source.getUint(offset - leaderBytes, leaderBytes) };
|
|
392
392
|
}
|
|
393
393
|
const byteCounts = this.tags.get(TiffTag.TileByteCounts);
|
|
394
394
|
if (byteCounts == null) {
|
|
395
395
|
throw new Error('No tile byte counts found');
|
|
396
396
|
}
|
|
397
|
-
const [offset, imageSize] = await Promise.all([this.getTileOffset(index
|
|
397
|
+
const [offset, imageSize] = await Promise.all([this.getTileOffset(index), byteCounts.getValueAt(index)]);
|
|
398
398
|
return { offset, imageSize };
|
|
399
399
|
}
|
|
400
400
|
}
|
|
401
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nLnRpZmYuaW1hZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29nLnRpZmYuaW1hZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTdELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHaEQsd0JBQXdCO0FBQ3hCLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLEtBQUssQ0FBQztBQXNCM0MsTUFBTSxPQUFPLFlBQVk7SUFjckIsWUFBWSxHQUFZLEVBQUUsRUFBVSxFQUFFLElBQWtDO1FBTHhFLHNDQUFzQztRQUM5QixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUM5QixpREFBaUQ7UUFDakQsWUFBTyxHQUFxQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBR2xELElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssRUFBRSxJQUFhLElBQVc7UUFDcEQsTUFBTSxZQUFZLEdBQUc7WUFDakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDakMsSUFBSSxD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QUMsQ0FBQyxDQUFDO1lBQ3RFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsV0FBVyxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUM7U0FDNUY7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFxQixDQUFDO1FBQzdFLElBQUksVUFBVSxJQUFJLElBQUksRUFBRTtZQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7U0FDaEQ7UUFDRCxNQUFNLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvRyxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ2pDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvZ1R5cGUgfSBmcm9tICdAY2h1bmtkL2NvcmUnO1xuaW1wb3J0IHsgQ29nVGlmZiB9IGZyb20gJy4vY29nLnRpZmYuanMnO1xuaW1wb3J0IHsgVGlmZkNvbXByZXNzaW9uLCBUaWZmTWltZVR5cGUgfSBmcm9tICcuL2NvbnN0L3RpZmYubWltZS5qcyc7XG5pbXBvcnQgeyBUaWZmVGFnLCBUaWZmVGFnR2VvIH0gZnJvbSAnLi9jb25zdC90aWZmLnRhZy5pZC5qcyc7XG5pbXBvcnQgeyBDb2dUaWZmVGFnQmFzZSB9IGZyb20gJy4vcmVhZC90YWcvdGlmZi50YWcuYmFzZS5qcyc7XG5pbXBvcnQgeyBDb2dUaWZmVGFnTGF6eSB9IGZyb20gJy4vcmVhZC90YWcvdGlmZi50YWcubGF6eS5qcyc7XG5pbXBvcnQgeyBDb2dUaWZmVGFnT2Zmc2V0IH0gZnJvbSAnLi9yZWFkL3RhZy90aWZmLnRhZy5vZmZzZXQuanMnO1xuaW1wb3J0IHsgQ29nVGlmZlRhZyB9IGZyb20gJy4vcmVhZC90aWZmLnRhZy5qcyc7XG5pbXBvcnQgeyBCb3VuZGluZ0JveCwgU2l6ZSB9IGZyb20gJy4vdmVjdG9yLmpzJztcblxuLyoqIEludmFsaWQgRVBTRyBjb2RlICovXG5leHBvcnQgY29uc3QgSW52YWxpZFByb2plY3Rpb25Db2RlID0gMzI3Njc7XG5cbi8qKlxuICogTnVtYmVyIG9mIHRpbGVzIHVzZWQgaW5zaWRlIHRoaXMgaW1hZ2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2dUaWZmSW1hZ2VUaWxlZENvdW50IHtcbiAgICAvKiogTnVtYmVyIG9mIHRpbGVzIG9uIHRoZSB4IGF4aXMgKi9cbiAgICB4OiBudW1iZXI7XG4gICAgLyoqIE51bWJlciBvZiB0aWxlcyBvbiB0aGUgeSBheGlzICovXG4gICAgeTogbnVtYmVyO1xufVxuXG4vKipcbiAqIFNpemUgb2YgYSBpbmRpdmlkdWFsIHRpbGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2dUaWZmSW1hZ2VUaWxlU2l6ZSB7XG4gICAgLyoqIFRpbGUgd2lkdGggKHBpeGVscykgKi9cbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIC8qKiBUaWxlIGhlaWdodCAocGl4ZWxzKSAqL1xuICAgIGhlaWdodDogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgQ29nVGlmZkltYWdlIHtcbiAgICAvKiogQWxsIElGRCB0YWdzIHRoYXQgaGF2ZSBiZWVuIHJlYWQgZm9yIHRoZSBpbWFnZSAqL1xuICAgIHRhZ3M6IE1hcDxUaWZmVGFnLCBDb2dUaWZmVGFnQmFzZT47XG5cbiAgICAvKiogSWQgb2YgdGhlIHRpZiBpbWFnZSwgZ2VuZXJhbGx5IHRoZSBpbWFnZSBpbmRleCBpbnNpZGUgdGhlIHRpZiAqL1xuICAgIGlkOiBudW1iZXI7XG5cbiAgICB0aWY6IENvZ1RpZmY7XG5cbiAgICAvKiogSGFzIGxvYWRHZW9UaWZmVGFncyBiZWVuIGNhbGxlZCAqL1xuICAgIHByaXZhdGUgdGFnc0dlb0xvYWRlZCA9IGZhbHNlO1xuICAgIC8qKiBTdWIgdGFncyBzdG9yZWQgaW4gVGlmZlRhZy5HZW9LZXlEaXJlY3RvcnkgKi9cbiAgICB0YWdzR2VvOiBNYXA8VGlmZlRhZ0dlbywgc3RyaW5nIHwgbnVtYmVyPiA9IG5ldyBNYXAoKTtcblxuICAgIGNvbnN0cnVjdG9yKHRpZjogQ29nVGlmZiwgaWQ6IG51bWJlciwgdGFnczogTWFwPFRpZmZUYWcsIENvZ1RpZmZUYWdCYXNlPikge1xuICAgICAgICB0aGlzLnRpZiA9IHRpZjtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLnRhZ3MgPSB0YWdzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvcmNlIGxvYWRpbmcgb2YgaW1wb3J0YW50IHRhZ3MgaWYgdGhleSBoYXZlIG5vdCBhbHJlYWR5IGJlZW4gbG9hZGVkXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbG9hZEdlb1RhZ3MgV2hldGhlciB0byBsb2FkIHRoZSBHZW9LZXlEaXJlY3RvcnkgYW5kIHVucGFjayBpdFxuICAgICAqL1xuICAgIGFzeW5jIGluaXQobG9hZEdlb1RhZ3MgPSBmYWxzZSwgbDogTG9nVHlwZSA9IG51bGwgYXMgYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHJlcXVpcmVkVGFncyA9IFtcbiAgICAgICAgICAgIHRoaXMuZmV0Y2goVGlmZlRhZy5Db21wcmVzc2lvbiwgbCksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuSW1hZ2VIZWlnaHQsIGwpLFxuICAgICAgICAgICAgdGhpcy5mZXRjaChUaWZmVGFnLkltYWdlV2lkdGgsIGwpLFxuICAgICAgICAgICAgdGhpcy5mZXRjaChUaWZmVGFnLk1vZGVsUGl4ZWxTY2FsZSwgbCksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuTW9kZWxUaWVQb2ludCwgbCksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuTW9kZWxUcmFuc2Zvcm1hdGlvbiwgbCksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuVGlsZUhlaWdodCwgbCksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuVGlsZVdpZHRoLCBsKSxcbiAgICAgICAgXTtcblxuICAgICAgICBpZiAobG9hZEdlb1RhZ3MpIHtcbiAgICAgICAgICAgIHJlcXVpcmVkVGFncy5wdXNoKHRoaXMuZmV0Y2goVGlmZlRhZy5HZW9LZXlEaXJlY3RvcnksIGwpKTtcbiAgICAgICAgICAgIHJlcXVpcmVkVGFncy5wdXNoKHRoaXMuZmV0Y2goVGlmZlRhZy5HZW9Bc2NpaVBhcmFtcywgbCkpO1xuICAgICAgICAgICAgcmVxdWlyZWRUYWdzLnB1c2godGhpcy5mZXRjaChUaWZmVGFnLkdlb0RvdWJsZVBhcmFtcywgbCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocmVxdWlyZWRUYWdzKTtcbiAgICAgICAgaWYgKGxvYWRHZW9UYWdzKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRHZW9UaWZmVGFncyhsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgb2YgYSBUaWZmVGFnIGlmIGl0IGV4aXN0cyBudWxsIG90aGVyd2lzZVxuICAgICAqL1xuICAgIHZhbHVlPFQ+KHRhZzogVGlmZlRhZyk6IFQgfCBudWxsIHtcbiAgICAgICAgY29uc3Qgc291cmNlVGFnID0gdGhpcy50YWdzLmdldCh0YWcpO1xuICAgICAgICBpZiAoc291cmNlVGFnID09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gc291cmNlVGFnLnZhbHVlIGFzIFQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCBhbmQgdW5wYWNrIHRoZSBHZW9LZXlEaXJlY3RvcnlcbiAgICAgKi9cbiAgICBhc3luYyBsb2FkR2VvVGlmZlRhZ3MobDogTG9nVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBBbHJlYWR5IGxvYWRlZFxuICAgICAgICBpZiAodGhpcy50YWdzR2VvTG9hZGVkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHNvdXJjZVRhZyA9IHRoaXMudGFncy5nZXQoVGlmZlRhZy5HZW9LZXlEaXJlY3RvcnkpO1xuICAgICAgICBpZiAoc291cmNlVGFnID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudGFnc0dlb0xvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzb3VyY2VUYWcuaXNSZWFkeSAmJiBzb3VyY2VUYWcgaW5zdGFuY2VvZiBDb2dUaWZmVGFnTGF6eSkge1xuICAgICAgICAgICAgLy8gTG9hZCBhbGwgdGhlIHJlcXVpcmVkIGtleXNcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuR2VvS2V5RGlyZWN0b3J5LCBsKSxcbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuR2VvQXNjaWlQYXJhbXMsIGwpLFxuICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2goVGlmZlRhZy5HZW9Eb3VibGVQYXJhbXMsIGwpLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50YWdzR2VvTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHNvdXJjZVRhZy52YWx1ZSA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGdlb1RhZ3MgPSBzb3VyY2VUYWcudmFsdWU7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShnZW9UYWdzKSkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGdlbyB0YWdzIGZvdW5kJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSA0OyBpIDw9IGdlb1RhZ3NbM10gKiA0OyBpICs9IDQpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGdlb1RhZ3NbaV0gYXMgVGlmZlRhZ0dlbztcbiAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gZ2VvVGFnc1tpICsgMV07XG5cbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGdlb1RhZ3NbaSArIDNdO1xuXG4gICAgICAgICAgICBpZiAobG9jYXRpb24gPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ3NHZW8uc2V0KGtleSwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHRoaXMudGFncy5nZXQobG9jYXRpb24pO1xuICAgICAgICAgICAgaWYgKHRhZyA9PSBudWxsIHx8IHRhZy52YWx1ZSA9PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gZ2VvVGFnc1tpICsgMl07XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0YWcudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50YWdzR2VvLnNldChrZXksIHRhZy52YWx1ZVtvZmZzZXQgKyBjb3VudCAtIDFdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRhZy52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ3NHZW8uc2V0KGtleSwgdGFnLnZhbHVlLnN1YnN0cihvZmZzZXQsIG9mZnNldCArIGNvdW50IC0gMSkudHJpbSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYXNzb2NpYXRlZCBHZW9UaWZmVGFnc1xuICAgICAqL1xuICAgIHZhbHVlR2VvKHRhZzogVGlmZlRhZ0dlbyk6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICh0aGlzLnRhZ3NHZW9Mb2FkZWQgPT09IGZhbHNlKSB0aHJvdyBuZXcgRXJyb3IoJ2xvYWRHZW9UaWZmVGFncygpIGhhcyBub3QgYmVlbiBjYWxsZWQnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFnc0dlby5nZXQodGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGEgdGFnLCBpZiBpdCBpcyBub3QgY3VycmVudGx5IGxvYWRlZCwgZmV0Y2ggdGhlIHJlcXVpcmVkIGRhdGEgZm9yIHRoZSB0YWcuXG4gICAgICogQHBhcmFtIHRhZyB0YWcgdG8gZmV0Y2hcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZmV0Y2g8VD4odGFnOiBUaWZmVGFnLCBsOiBMb2dUeXBlKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICAgICAgICBjb25zdCBzb3VyY2VUYWcgPSB0aGlzLnRhZ3MuZ2V0KHRhZyk7XG4gICAgICAgIGlmIChzb3VyY2VUYWcgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChDb2dUaWZmVGFnLmlzTGF6eShzb3VyY2VUYWcpKSByZXR1cm4gc291cmNlVGFnLmZldGNoKGwpIGFzIGFueTtcbiAgICAgICAgcmV0dXJuIHNvdXJjZVRhZy52YWx1ZSBhcyBUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgb3JpZ2luIHBvaW50IGZvciB0aGUgaW1hZ2VcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIG9yaWdpbiBwb2ludCBvZiB0aGUgaW1hZ2VcbiAgICAgKi9cbiAgICBnZXQgb3JpZ2luKCk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gICAgICAgIGNvbnN0IHRpZVBvaW50czogbnVtYmVyW10gfCBudWxsID0gdGhpcy52YWx1ZTxudW1iZXJbXT4oVGlmZlRhZy5Nb2RlbFRpZVBvaW50KTtcbiAgICAgICAgaWYgKHRpZVBvaW50cyAhPSBudWxsICYmIHRpZVBvaW50cy5sZW5ndGggPT09IDYpIHtcbiAgICAgICAgICAgIHJldHVybiBbdGllUG9pbnRzWzNdLCB0aWVQb2ludHNbNF0sIHRpZVBvaW50c1s1XV07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtb2RlbFRyYW5zZm9ybWF0aW9uID0gdGhpcy52YWx1ZTxudW1iZXJbXT4oVGlmZlRhZy5Nb2RlbFRyYW5zZm9ybWF0aW9uKTtcbiAgICAgICAgaWYgKG1vZGVsVHJhbnNmb3JtYXRpb24gIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFttb2RlbFRyYW5zZm9ybWF0aW9uWzNdLCBtb2RlbFRyYW5zZm9ybWF0aW9uWzddLCBtb2RlbFRyYW5zZm9ybWF0aW9uWzExXV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgc3ViIGltYWdlLCB1c2UgdGhlIG9yaWdpbiBmcm9tIHRoZSB0b3AgbGV2ZWwgaW1hZ2VcbiAgICAgICAgaWYgKHRoaXMudmFsdWUoVGlmZlRhZy5OZXdTdWJGaWxlVHlwZSkgPT09IDEgJiYgdGhpcy5pZCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGlmLmltYWdlc1swXS5vcmlnaW47XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ltYWdlIGRvZXMgbm90IGhhdmUgYSBnZW8gdHJhbnNmb3JtYXRpb24uJyk7XG4gICAgfVxuXG4gICAgLyoqIElzIHRoZXJlIGVub3VnaCBnZW8gaW5mb3JtYXRpb24gb24gdGhpcyBpbWFnZSB0byBmaWd1cmUgb3V0IHdoZXJlIGl0cyBhY3R1YWxseSBsb2NhdGVkICovXG4gICAgZ2V0IGlzR2VvTG9jYXRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaXNJbWFnZUxvY2F0ZWQgPVxuICAgICAgICAgICAgdGhpcy52YWx1ZShUaWZmVGFnLk1vZGVsUGl4ZWxTY2FsZSkgIT0gbnVsbCB8fCB0aGlzLnZhbHVlKFRpZmZUYWcuTW9kZWxUcmFuc2Zvcm1hdGlvbikgIT0gbnVsbDtcbiAgICAgICAgaWYgKGlzSW1hZ2VMb2NhdGVkKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHN1YiBpbWFnZSwgdXNlIHRoZSBpc0dlb0xvY2F0ZWQgZnJvbSB0aGUgdG9wIGxldmVsIGltYWdlXG4gICAgICAgIGlmICh0aGlzLnZhbHVlKFRpZmZUYWcuTmV3U3ViRmlsZVR5cGUpID09PSAxICYmIHRoaXMuaWQgIT09IDApIHJldHVybiB0aGlzLnRpZi5pbWFnZXNbMF0uaXNHZW9Mb2NhdGVkO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSByZXNvbHV0aW9uIG9mIHRoZSBpbWFnZVxuICAgICAqXG4gICAgICogQHJldHVybnMgW3gseSx6XSBwaXhlbCBzY2FsZVxuICAgICAqL1xuICAgIGdldCByZXNvbHV0aW9uKCk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gICAgICAgIGNvbnN0IG1vZGVsUGl4ZWxTY2FsZTogbnVtYmVyW10gfCBudWxsID0gdGhpcy52YWx1ZShUaWZmVGFnLk1vZGVsUGl4ZWxTY2FsZSk7XG4gICAgICAgIGlmIChtb2RlbFBpeGVsU2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFttb2RlbFBpeGVsU2NhbGVbMF0sIC1tb2RlbFBpeGVsU2NhbGVbMV0sIG1vZGVsUGl4ZWxTY2FsZVsyXV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbW9kZWxUcmFuc2Zvcm1hdGlvbjogbnVtYmVyW10gfCBudWxsID0gdGhpcy52YWx1ZShUaWZmVGFnLk1vZGVsVHJhbnNmb3JtYXRpb24pO1xuICAgICAgICBpZiAobW9kZWxUcmFuc2Zvcm1hdGlvbiAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gW21vZGVsVHJhbnNmb3JtYXRpb25bMF0sIG1vZGVsVHJhbnNmb3JtYXRpb25bNV0sIG1vZGVsVHJhbnNmb3JtYXRpb25bMTBdXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBzdWIgaW1hZ2UsIHVzZSB0aGUgcmVzb2x1dGlvbiBmcm9tIHRoZSB0b3AgbGV2ZWwgaW1hZ2VcbiAgICAgICAgaWYgKHRoaXMudmFsdWUoVGlmZlRhZy5OZXdTdWJGaWxlVHlwZSkgPT09IDEgJiYgdGhpcy5pZCAhPT0gMCkge1xuICAgICAgICAgICAgY29uc3QgZmlyc3RJbWcgPSB0aGlzLnRpZi5pbWFnZXNbMF07XG4gICAgICAgICAgICBjb25zdCBbcmVzWCwgcmVzWSwgcmVzWl0gPSBmaXJzdEltZy5yZXNvbHV0aW9uO1xuICAgICAgICAgICAgY29uc3QgZmlyc3RJbWdTaXplID0gZmlyc3RJbWcuc2l6ZTtcbiAgICAgICAgICAgIGNvbnN0IGltZ1NpemUgPSB0aGlzLnNpemU7XG4gICAgICAgICAgICAvLyBzY2FsZSByZXNvbHV0aW9uIGJhc2VkIG9uIHRoZSBzaXplIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIGltYWdlc1xuICAgICAgICAgICAgcmV0dXJuIFsocmVzWCAqIGZpcnN0SW1nU2l6ZS53aWR0aCkgLyBpbWdTaXplLndpZHRoLCAocmVzWSAqIGZpcnN0SW1nU2l6ZS5oZWlnaHQpIC8gaW1nU2l6ZS5oZWlnaHQsIHJlc1pdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbWFnZSBkb2VzIG5vdCBoYXZlIGEgZ2VvIHRyYW5zZm9ybWF0aW9uLicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJvdW5kaW5nIGJveCBvZiB0aGUgaW1hZ2VcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSBib3VuZGluZyBib3hcbiAgICAgKi9cbiAgICBnZXQgYmJveCgpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIGNvbnN0IG9yaWdpbiA9IHRoaXMub3JpZ2luO1xuICAgICAgICBjb25zdCByZXNvbHV0aW9uID0gdGhpcy5yZXNvbHV0aW9uO1xuXG4gICAgICAgIGlmIChvcmlnaW4gPT0gbnVsbCB8fCBzaXplID09IG51bGwgfHwgcmVzb2x1dGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBjYWxjdWxhdGUgYm91bmRpbmcgYm94Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB4MSA9IG9yaWdpblswXTtcbiAgICAgICAgY29uc3QgeTEgPSBvcmlnaW5bMV07XG5cbiAgICAgICAgY29uc3QgeDIgPSB4MSArIHJlc29sdXRpb25bMF0gKiBzaXplLndpZHRoO1xuICAgICAgICBjb25zdCB5MiA9IHkxICsgcmVzb2x1dGlvblsxXSAqIHNpemUuaGVpZ2h0O1xuXG4gICAgICAgIHJldHVybiBbTWF0aC5taW4oeDEsIHgyKSwgTWF0aC5taW4oeTEsIHkyKSwgTWF0aC5tYXgoeDEsIHgyKSwgTWF0aC5tYXgoeTEsIHkyKV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjb21wcmVzc2lvbiB1c2VkIGJ5IHRoZSB0aWxlXG4gICAgICpcbiAgICAgKiBAc2VlIFRpZmZDb21wcmVzc2lvblxuICAgICAqXG4gICAgICogQHJldHVybnMgQ29tcHJlc3Npb24gdHlwZSBlZyB3ZWJwXG4gICAgICovXG4gICAgZ2V0IGNvbXByZXNzaW9uKCk6IFRpZmZNaW1lVHlwZSB8IG51bGwge1xuICAgICAgICBjb25zdCBjb21wcmVzc2lvbiA9IHRoaXMudmFsdWUoVGlmZlRhZy5Db21wcmVzc2lvbik7XG4gICAgICAgIGlmIChjb21wcmVzc2lvbiA9PSBudWxsIHx8IHR5cGVvZiBjb21wcmVzc2lvbiAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBUaWZmQ29tcHJlc3Npb25bY29tcHJlc3Npb25dO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dGVtcHQgdG8gcmVhZCB0aGUgRVBTRyBDb2RlIGZyb20gVGlmZkdlb1RhZ3NcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEVQU0cgQ29kZSBpZiBpdCBleGlzdHNcbiAgICAgKi9cbiAgICBnZXQgZXBzZygpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbiA9IHRoaXMudmFsdWVHZW8oVGlmZlRhZ0dlby5Qcm9qZWN0ZWRDU1R5cGVHZW9LZXkpIGFzIG51bWJlcjtcbiAgICAgICAgaWYgKHByb2plY3Rpb24gPT09IEludmFsaWRQcm9qZWN0aW9uQ29kZSkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBwcm9qZWN0aW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2VcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNpemUgaW4gcGl4ZWxzXG4gICAgICovXG4gICAgZ2V0IHNpemUoKTogU2l6ZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3aWR0aDogdGhpcy52YWx1ZTxudW1iZXI+KFRpZmZUYWcuSW1hZ2VXaWR0aCkgYXMgbnVtYmVyLFxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLnZhbHVlPG51bWJlcj4oVGlmZlRhZy5JbWFnZUhlaWdodCkgYXMgbnVtYmVyLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbGlzdCBvZiBJRkQgdGFncyB0aGF0IHdlcmUgcmVhZFxuICAgICAqL1xuICAgIGdldCB0YWdMaXN0KCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLnRhZ3Mua2V5cygpXS5tYXAoKGMpID0+IFRpZmZUYWdbY10pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZSBpZiB0aGlzIGltYWdlIGlzIHRpbGVkXG4gICAgICovXG4gICAgcHVibGljIGlzVGlsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlKFRpZmZUYWcuVGlsZVdpZHRoKSAhPT0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc2l6ZSBvZiBpbmRpdmlkdWFsIHRpbGVzXG4gICAgICovXG4gICAgZ2V0IHRpbGVTaXplKCk6IENvZ1RpZmZJbWFnZVRpbGVTaXplIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLnZhbHVlPG51bWJlcj4oVGlmZlRhZy5UaWxlV2lkdGgpIGFzIG51bWJlcixcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy52YWx1ZTxudW1iZXI+KFRpZmZUYWcuVGlsZUhlaWdodCkgYXMgbnVtYmVyLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiB0aWxlcyB1c2VkIHRvIGNyZWF0ZSB0aGlzIGltYWdlXG4gICAgICovXG4gICAgZ2V0IHRpbGVDb3VudCgpOiBDb2dUaWZmSW1hZ2VUaWxlZENvdW50IHtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuc2l6ZTtcbiAgICAgICAgY29uc3QgdGlsZVNpemUgPSB0aGlzLnRpbGVTaXplO1xuICAgICAgICBjb25zdCB4ID0gTWF0aC5jZWlsKHNpemUud2lkdGggLyB0aWxlU2l6ZS53aWR0aCk7XG4gICAgICAgIGNvbnN0IHkgPSBNYXRoLmNlaWwoc2l6ZS5oZWlnaHQgLyB0aWxlU2l6ZS5oZWlnaHQpO1xuICAgICAgICByZXR1cm4geyB4LCB5IH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBwb2ludGVyIHRvIHdoZXJlIHRoZSB0aWxlcyBzdGFydCBpbiB0aGUgVGlmZiBmaWxlXG4gICAgICpcbiAgICAgKiBAcmVtYXJrcyBVc2VkIHRvIHJlYWQgdGlsZWQgdGlmZnNcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGZpbGUgb2Zmc2V0IHRvIHdoZXJlIHRoZSB0aWZmcyBhcmUgc3RvcmVkXG4gICAgICovXG4gICAgZ2V0IHRpbGVPZmZzZXQoKTogQ29nVGlmZlRhZ09mZnNldCB7XG4gICAgICAgIGNvbnN0IHRpbGVPZmZzZXQgPSB0aGlzLnRhZ3MuZ2V0KFRpZmZUYWcuVGlsZU9mZnNldHMpIGFzIENvZ1RpZmZUYWdPZmZzZXQ7XG4gICAgICAgIGlmICh0aWxlT2Zmc2V0ID09IG51bGwpIHRocm93IG5ldyBFcnJvcignTm8gdGlsZSBvZmZzZXRzIGZvdW5kJyk7XG4gICAgICAgIHJldHVybiB0aWxlT2Zmc2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIHN0cmlwJ3MgaW5zaWRlIHRoaXMgdGlmZlxuICAgICAqXG4gICAgICogQHJlbWFya3MgVXNlZCB0byByZWFkIHN0cmlwZWQgdGlmZnNcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIG51bWJlciBvZiBzdHJpcHMgcHJlc2VudFxuICAgICAqL1xuICAgIGdldCBzdHJpcENvdW50KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHRpbGVPZmZzZXQgPSB0aGlzLnRhZ3MuZ2V0KFRpZmZUYWcuU3RyaXBCeXRlQ291bnRzKSBhcyBDb2dUaWZmVGFnT2Zmc2V0O1xuICAgICAgICBpZiAodGlsZU9mZnNldCA9PSBudWxsKSByZXR1cm4gMDtcbiAgICAgICAgcmV0dXJuIHRpbGVPZmZzZXQuZGF0YUNvdW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIHBvaW50ZXIgdG8gYSBzcGVjaWZpYyB0aWxlIGluc2lkZSB0aGUgdGlmZiBmaWxlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaW5kZXggdGlsZSBpbmRleFxuICAgICAqIEByZXR1cm5zIGZpbGUgb2Zmc2V0IG9mIHRoZSBzcGVjaWZpZWQgdGlsZVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhc3luYyBnZXRUaWxlT2Zmc2V0KGluZGV4OiBudW1iZXIsIGw/OiBMb2dUeXBlKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgY29uc3QgdGlsZU9mZnNldCA9IHRoaXMudGlsZU9mZnNldDtcbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IHRpbGVPZmZzZXQuZGF0YUNvdW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRpbGUgb2Zmc2V0OiAke2luZGV4fSBvdXQgb2YgcmFuZ2U6IDAgLT4gJHt0aWxlT2Zmc2V0LmRhdGFDb3VudH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZldGNoIG9ubHkgdGhlIHBhcnQgb2YgdGhlIG9mZnNldHMgdGhhdCBhcmUgbmVlZGVkXG4gICAgICAgIHJldHVybiB0aWxlT2Zmc2V0LmdldFZhbHVlQXQoaW5kZXgsIGwpO1xuICAgIH1cblxuICAgIC8vIENsYW1wIHRoZSBib3VuZHMgb2YgdGhlIG91dHB1dCBpbWFnZSB0byB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2UsIGFzIHNvbWV0aW1lcyB0aGUgZWRnZSB0aWxlcyBhcmUgbm90IGZ1bGwgdGlsZXNcbiAgICBnZXRUaWxlQm91bmRzKHg6IG51bWJlciwgeTogbnVtYmVyKTogQm91bmRpbmdCb3gge1xuICAgICAgICBjb25zdCB7IHNpemUsIHRpbGVTaXplIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCB0b3AgPSB5ICogdGlsZVNpemUuaGVpZ2h0O1xuICAgICAgICBjb25zdCBsZWZ0ID0geCAqIHRpbGVTaXplLndpZHRoO1xuICAgICAgICBjb25zdCB3aWR0aCA9IGxlZnQgKyB0aWxlU2l6ZS53aWR0aCA+PSBzaXplLndpZHRoID8gc2l6ZS53aWR0aCAtIGxlZnQgOiB0aWxlU2l6ZS53aWR0aDtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gdG9wICsgdGlsZVNpemUuaGVpZ2h0ID49IHNpemUuaGVpZ2h0ID8gc2l6ZS5oZWlnaHQgLSB0b3AgOiB0aWxlU2l6ZS5oZWlnaHQ7XG4gICAgICAgIHJldHVybiB7IHg6IGxlZnQsIHk6IHRvcCwgd2lkdGgsIGhlaWdodCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBzdHJpcCBpbnRvIGEgdWludDggYXJyYXlcbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbmRleCBTdHJpcCBpbmRleCB0byByZWFkXG4gICAgICovXG4gICAgYXN5bmMgZ2V0U3RyaXAoaW5kZXg6IG51bWJlcik6IFByb21pc2U8eyBtaW1lVHlwZTogVGlmZk1pbWVUeXBlOyBieXRlczogVWludDhBcnJheSB9IHwgbnVsbD4ge1xuICAgICAgICBpZiAodGhpcy5pc1RpbGVkKCkpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlYWQgc3RyaXBlcywgdGlmZiBpcyB0aWxlZCcpO1xuXG4gICAgICAgIGNvbnN0IGJ5dGVDb3VudHMgPSB0aGlzLnRhZ3MuZ2V0KFRpZmZUYWcuU3RyaXBCeXRlQ291bnRzKSBhcyBDb2dUaWZmVGFnT2Zmc2V0O1xuICAgICAgICBjb25zdCBvZmZzZXRzID0gdGhpcy50YWdzLmdldChUaWZmVGFnLlN0cmlwT2Zmc2V0cykgYXMgQ29nVGlmZlRhZ09mZnNldDtcblxuICAgICAgICBpZiAoaW5kZXggPj0gYnl0ZUNvdW50cy5kYXRhQ291bnQpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlYWQgc3RyaXAsIGluZGV4IG91dCBvZiBib3VuZHMnKTtcblxuICAgICAgICBjb25zdCBbYnl0ZUNvdW50LCBvZmZzZXRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW29mZnNldHMuZ2V0VmFsdWVBdChpbmRleCksIGJ5dGVDb3VudHMuZ2V0VmFsdWVBdChpbmRleCldKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Qnl0ZXMoYnl0ZUNvdW50LCBvZmZzZXQpO1xuICAgIH1cblxuICAgIC8qKiBUaGUganBlZyBoZWFkZXIgaXMgc3RvcmVkIGluIHRoZSBJRkQsIHJlYWQgdGhlIEpQRUcgaGVhZGVyIGFuZCBhZGp1c3QgdGhlIGJ5dGUgYXJyYXkgdG8gaW5jbHVkZSBpdCAqL1xuICAgIHByaXZhdGUgZ2V0SnBlZ0hlYWRlcihieXRlczogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkge1xuICAgICAgICAvLyBCb3RoIHRoZSBKUEVHVGFibGUgYW5kIHRoZSBCeXRlcyB3aXRoIGhhdmUgdGhlIHN0YXJ0IG9mIGltYWdlIGFuZCBlbmQgb2YgaW1hZ2UgbWFya2Vyc1xuICAgICAgICAvLyBTdGFydE9mSW1hZ2UgMHhmZmQ4IEVuZE9mSW1hZ2UgMHhmZmQ5XG4gICAgICAgIGNvbnN0IHRhYmxlcyA9IHRoaXMudmFsdWU8bnVtYmVyW10+KFRpZmZUYWcuSlBFR1RhYmxlcyk7XG4gICAgICAgIGlmICh0YWJsZXMgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBKcGVnIGhlYWRlcicpO1xuXG4gICAgICAgIC8vIFJlbW92ZSBFbmRPZkltYWdlIG1hcmtlclxuICAgICAgICBjb25zdCB0YWJsZURhdGEgPSB0YWJsZXMuc2xpY2UoMCwgdGFibGVzLmxlbmd0aCAtIDIpO1xuICAgICAgICBjb25zdCBhY3R1YWxCeXRlcyA9IG5ldyBVaW50OEFycmF5KGJ5dGVzLmJ5dGVMZW5ndGggKyB0YWJsZURhdGEubGVuZ3RoIC0gMik7XG4gICAgICAgIGFjdHVhbEJ5dGVzLnNldCh0YWJsZURhdGEsIDApO1xuICAgICAgICBhY3R1YWxCeXRlcy5zZXQoYnl0ZXMuc2xpY2UoMiksIHRhYmxlRGF0YS5sZW5ndGgpO1xuICAgICAgICByZXR1cm4gYWN0dWFsQnl0ZXM7XG4gICAgfVxuXG4gICAgLyoqIFJlYWQgaW1hZ2UgYnl0ZXMgYXQgdGhlIGdpdmVuIG9mZnNldCAqL1xuICAgIHByaXZhdGUgYXN5bmMgZ2V0Qnl0ZXMoXG4gICAgICAgIG9mZnNldDogbnVtYmVyLFxuICAgICAgICBieXRlQ291bnQ6IG51bWJlcixcbiAgICAgICAgbD86IExvZ1R5cGUsXG4gICAgKTogUHJvbWlzZTx7IG1pbWVUeXBlOiBUaWZmTWltZVR5cGU7IGJ5dGVzOiBVaW50OEFycmF5IH0gfCBudWxsPiB7XG4gICAgICAgIGNvbnN0IG1pbWVUeXBlID0gdGhpcy5jb21wcmVzc2lvbjtcbiAgICAgICAgaWYgKG1pbWVUeXBlID09IG51bGwpIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgY29tcHJlc3Npb246ICcgKyB0aGlzLnZhbHVlKFRpZmZUYWcuQ29tcHJlc3Npb24pKTtcbiAgICAgICAgaWYgKGJ5dGVDb3VudCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgYXdhaXQgdGhpcy50aWYuc291cmNlLmxvYWRCeXRlcyhvZmZzZXQsIGJ5dGVDb3VudCwgbCk7XG4gICAgICAgIGNvbnN0IGJ5dGVzID0gdGhpcy50aWYuc291cmNlLmJ5dGVzKG9mZnNldCwgYnl0ZUNvdW50KTtcblxuICAgICAgICBpZiAodGhpcy5jb21wcmVzc2lvbiA9PT0gVGlmZk1pbWVUeXBlLkpQRUcpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG1pbWVUeXBlLCBieXRlczogdGhpcy5nZXRKcGVnSGVhZGVyKGJ5dGVzKSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG1pbWVUeXBlLCBieXRlcyB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgdGhlIHRpbGUgYnVmZmVyLCB0aGlzIHdvcmtzIGJlc3Qgd2l0aCB3ZWJwXG4gICAgICpcbiAgICAgKiBUaGlzIHdpbGwgYWxzbyBhcHBseSB0aGUgSlBFRyBjb21wcmVzc2lvbiB0YWJsZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IFRpbGUgeCBvZmZzZXRcbiAgICAgKiBAcGFyYW0geSBUaWxlIHkgb2Zmc2V0XG4gICAgICovXG4gICAgYXN5bmMgZ2V0VGlsZSh4OiBudW1iZXIsIHk6IG51bWJlciwgbD86IExvZ1R5cGUpOiBQcm9taXNlPHsgbWltZVR5cGU6IFRpZmZNaW1lVHlwZTsgYnl0ZXM6IFVpbnQ4QXJyYXkgfSB8IG51bGw+IHtcbiAgICAgICAgY29uc3QgbWltZVR5cGUgPSB0aGlzLmNvbXByZXNzaW9uO1xuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5zaXplO1xuICAgICAgICBjb25zdCB0aWxlcyA9IHRoaXMudGlsZVNpemU7XG5cbiAgICAgICAgaWYgKHRpbGVzID09IG51bGwpIHRocm93IG5ldyBFcnJvcignVGlmZiBpcyBub3QgdGlsZWQnKTtcbiAgICAgICAgaWYgKG1pbWVUeXBlID09IG51bGwpIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgY29tcHJlc3Npb246ICcgKyB0aGlzLnZhbHVlKFRpZmZUYWcuQ29tcHJlc3Npb24pKTtcblxuICAgICAgICAvLyBUT0RPIHN1cHBvcnQgR2hvc3RPcHRpb25UaWxlT3JkZXJcbiAgICAgICAgY29uc3QgbnlUaWxlcyA9IE1hdGguY2VpbChzaXplLmhlaWdodCAvIHRpbGVzLmhlaWdodCk7XG4gICAgICAgIGNvbnN0IG54VGlsZXMgPSBNYXRoLmNlaWwoc2l6ZS53aWR0aCAvIHRpbGVzLndpZHRoKTtcblxuICAgICAgICBpZiAoeCA+PSBueFRpbGVzIHx8IHkgPj0gbnlUaWxlcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaWxlIGluZGV4IGlzIG91dHNpZGUgb2YgcmFuZ2UgeDoke3h9ID49ICR7bnhUaWxlc30gb3IgeToke3l9ID49ICR7bnlUaWxlc31gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlkeCA9IHkgKiBueFRpbGVzICsgeDtcbiAgICAgICAgY29uc3QgdG90YWxUaWxlcyA9IG54VGlsZXMgKiBueVRpbGVzO1xuICAgICAgICBpZiAoaWR4ID49IHRvdGFsVGlsZXMpIHRocm93IG5ldyBFcnJvcihgVGlsZSBpbmRleCBpcyBvdXRzaWRlIG9mIHRpbGUgcmFuZ2U6ICR7aWR4fSA+PSAke3RvdGFsVGlsZXN9YCk7XG5cbiAgICAgICAgY29uc3QgeyBvZmZzZXQsIGltYWdlU2l6ZSB9ID0gYXdhaXQgdGhpcy5nZXRUaWxlU2l6ZShpZHgsIGwpO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCeXRlcyhvZmZzZXQsIGltYWdlU2l6ZSwgbCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGdldFRpbGVTaXplKGluZGV4OiBudW1iZXIsIGw/OiBMb2dUeXBlKTogUHJvbWlzZTx7IG9mZnNldDogbnVtYmVyOyBpbWFnZVNpemU6IG51bWJlciB9PiB7XG4gICAgICAgIC8vIEdEQUwgb3B0aW1pemVzIHRpbGVzIGJ5IHN0b3JpbmcgdGhlIHNpemUgb2YgdGhlIHRpbGUgaW5cbiAgICAgICAgLy8gdGhlIGZldyBieXRlcyBsZWFkaW5nIHVwIHRvIHRoZSB0aWxlXG4gICAgICAgIGlmICh0aGlzLnRpZi5vcHRpb25zLnRpbGVMZWFkZXJCeXRlU2l6ZSkge1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYXdhaXQgdGhpcy5nZXRUaWxlT2Zmc2V0KGluZGV4LCBsKTtcbiAgICAgICAgICAgIC8vIFNwYXJzZSBDT0cgbm8gZGF0YSBmb3VuZFxuICAgICAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkgcmV0dXJuIHsgb2Zmc2V0OiAwLCBpbWFnZVNpemU6IDAgfTtcblxuICAgICAgICAgICAgY29uc3QgbGVhZGVyQnl0ZXMgPSB0aGlzLnRpZi5vcHRpb25zLnRpbGVMZWFkZXJCeXRlU2l6ZTtcbiAgICAgICAgICAgIC8vIFRoaXMgZmV0Y2ggd2lsbCBnZW5lcmFsbHkgbG9hZCBpbiB0aGUgYnl0ZXMgbmVlZGVkIGZvciB0aGUgaW1hZ2UgdG9vXG4gICAgICAgICAgICAvLyBwcm92aWRlZCB0aGUgaW1hZ2Ugc2l6ZSBpcyBsZXNzIHRoYW4gdGhlIHNpemUgb2YgYSBjaHVua1xuICAgICAgICAgICAgYXdhaXQgdGhpcy50aWYuc291cmNlLmxvYWRCeXRlcyhvZmZzZXQgLSBsZWFkZXJCeXRlcywgbGVhZGVyQnl0ZXMsIGwpO1xuICAgICAgICAgICAgcmV0dXJuIHsgb2Zmc2V0LCBpbWFnZVNpemU6IHRoaXMudGlmLnNvdXJjZS5nZXRVaW50KG9mZnNldCAtIGxlYWRlckJ5dGVzLCBsZWFkZXJCeXRlcykgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJ5dGVDb3VudHMgPSB0aGlzLnRhZ3MuZ2V0KFRpZmZUYWcuVGlsZUJ5dGVDb3VudHMpIGFzIENvZ1RpZmZUYWdPZmZzZXQ7XG4gICAgICAgIGlmIChieXRlQ291bnRzID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gdGlsZSBieXRlIGNvdW50cyBmb3VuZCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IFtvZmZzZXQsIGltYWdlU2l6ZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbdGhpcy5nZXRUaWxlT2Zmc2V0KGluZGV4LCBsKSwgYnl0ZUNvdW50cy5nZXRWYWx1ZUF0KGluZGV4LCBsKV0pO1xuICAgICAgICByZXR1cm4geyBvZmZzZXQsIGltYWdlU2l6ZSB9O1xuICAgIH1cbn1cbiJdfQ==
|
|
401
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nLnRpZmYuaW1hZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29nLnRpZmYuaW1hZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTdELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHaEQsd0JBQXdCO0FBQ3hCLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLEtBQUssQ0FBQztBQXNCM0MsTUFBTSxPQUFPLFlBQVk7SUFjckIsWUFBWSxHQUFZLEVBQUUsRUFBVSxFQUFFLElBQWtDO1FBTHhFLHNDQUFzQztRQUM5QixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUM5QixpREFBaUQ7UUFDakQsWUFBTyxHQUFxQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBR2xELElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUs7UUFDMUIsTUFBTSxZQUFZLEdBQUc7WUFDakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1lBQy9CLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7WUFDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDO1lBQ25DLElBQUks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LE1BQU0sQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxVQUFVLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6RyxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ2pDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvZ1RpZmYgfSBmcm9tICcuL2NvZy50aWZmLmpzJztcbmltcG9ydCB7IFRpZmZDb21wcmVzc2lvbiwgVGlmZk1pbWVUeXBlIH0gZnJvbSAnLi9jb25zdC90aWZmLm1pbWUuanMnO1xuaW1wb3J0IHsgVGlmZlRhZywgVGlmZlRhZ0dlbyB9IGZyb20gJy4vY29uc3QvdGlmZi50YWcuaWQuanMnO1xuaW1wb3J0IHsgQ29nVGlmZlRhZ0Jhc2UgfSBmcm9tICcuL3JlYWQvdGFnL3RpZmYudGFnLmJhc2UuanMnO1xuaW1wb3J0IHsgQ29nVGlmZlRhZ0xhenkgfSBmcm9tICcuL3JlYWQvdGFnL3RpZmYudGFnLmxhenkuanMnO1xuaW1wb3J0IHsgQ29nVGlmZlRhZ09mZnNldCB9IGZyb20gJy4vcmVhZC90YWcvdGlmZi50YWcub2Zmc2V0LmpzJztcbmltcG9ydCB7IENvZ1RpZmZUYWcgfSBmcm9tICcuL3JlYWQvdGlmZi50YWcuanMnO1xuaW1wb3J0IHsgQm91bmRpbmdCb3gsIFNpemUgfSBmcm9tICcuL3ZlY3Rvci5qcyc7XG5cbi8qKiBJbnZhbGlkIEVQU0cgY29kZSAqL1xuZXhwb3J0IGNvbnN0IEludmFsaWRQcm9qZWN0aW9uQ29kZSA9IDMyNzY3O1xuXG4vKipcbiAqIE51bWJlciBvZiB0aWxlcyB1c2VkIGluc2lkZSB0aGlzIGltYWdlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29nVGlmZkltYWdlVGlsZWRDb3VudCB7XG4gICAgLyoqIE51bWJlciBvZiB0aWxlcyBvbiB0aGUgeCBheGlzICovXG4gICAgeDogbnVtYmVyO1xuICAgIC8qKiBOdW1iZXIgb2YgdGlsZXMgb24gdGhlIHkgYXhpcyAqL1xuICAgIHk6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBTaXplIG9mIGEgaW5kaXZpZHVhbCB0aWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29nVGlmZkltYWdlVGlsZVNpemUge1xuICAgIC8qKiBUaWxlIHdpZHRoIChwaXhlbHMpICovXG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICAvKiogVGlsZSBoZWlnaHQgKHBpeGVscykgKi9cbiAgICBoZWlnaHQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIENvZ1RpZmZJbWFnZSB7XG4gICAgLyoqIEFsbCBJRkQgdGFncyB0aGF0IGhhdmUgYmVlbiByZWFkIGZvciB0aGUgaW1hZ2UgKi9cbiAgICB0YWdzOiBNYXA8VGlmZlRhZywgQ29nVGlmZlRhZ0Jhc2U+O1xuXG4gICAgLyoqIElkIG9mIHRoZSB0aWYgaW1hZ2UsIGdlbmVyYWxseSB0aGUgaW1hZ2UgaW5kZXggaW5zaWRlIHRoZSB0aWYgKi9cbiAgICBpZDogbnVtYmVyO1xuXG4gICAgdGlmOiBDb2dUaWZmO1xuXG4gICAgLyoqIEhhcyBsb2FkR2VvVGlmZlRhZ3MgYmVlbiBjYWxsZWQgKi9cbiAgICBwcml2YXRlIHRhZ3NHZW9Mb2FkZWQgPSBmYWxzZTtcbiAgICAvKiogU3ViIHRhZ3Mgc3RvcmVkIGluIFRpZmZUYWcuR2VvS2V5RGlyZWN0b3J5ICovXG4gICAgdGFnc0dlbzogTWFwPFRpZmZUYWdHZW8sIHN0cmluZyB8IG51bWJlcj4gPSBuZXcgTWFwKCk7XG5cbiAgICBjb25zdHJ1Y3Rvcih0aWY6IENvZ1RpZmYsIGlkOiBudW1iZXIsIHRhZ3M6IE1hcDxUaWZmVGFnLCBDb2dUaWZmVGFnQmFzZT4pIHtcbiAgICAgICAgdGhpcy50aWYgPSB0aWY7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy50YWdzID0gdGFncztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JjZSBsb2FkaW5nIG9mIGltcG9ydGFudCB0YWdzIGlmIHRoZXkgaGF2ZSBub3QgYWxyZWFkeSBiZWVuIGxvYWRlZFxuICAgICAqXG4gICAgICogQHBhcmFtIGxvYWRHZW9UYWdzIFdoZXRoZXIgdG8gbG9hZCB0aGUgR2VvS2V5RGlyZWN0b3J5IGFuZCB1bnBhY2sgaXRcbiAgICAgKi9cbiAgICBhc3luYyBpbml0KGxvYWRHZW9UYWdzID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcmVxdWlyZWRUYWdzID0gW1xuICAgICAgICAgICAgdGhpcy5mZXRjaChUaWZmVGFnLkNvbXByZXNzaW9uKSxcbiAgICAgICAgICAgIHRoaXMuZmV0Y2goVGlmZlRhZy5JbWFnZUhlaWdodCksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuSW1hZ2VXaWR0aCksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuTW9kZWxQaXhlbFNjYWxlKSxcbiAgICAgICAgICAgIHRoaXMuZmV0Y2goVGlmZlRhZy5Nb2RlbFRpZVBvaW50KSxcbiAgICAgICAgICAgIHRoaXMuZmV0Y2goVGlmZlRhZy5Nb2RlbFRyYW5zZm9ybWF0aW9uKSxcbiAgICAgICAgICAgIHRoaXMuZmV0Y2goVGlmZlRhZy5UaWxlSGVpZ2h0KSxcbiAgICAgICAgICAgIHRoaXMuZmV0Y2goVGlmZlRhZy5UaWxlV2lkdGgpLFxuICAgICAgICBdO1xuXG4gICAgICAgIGlmIChsb2FkR2VvVGFncykge1xuICAgICAgICAgICAgcmVxdWlyZWRUYWdzLnB1c2godGhpcy5mZXRjaChUaWZmVGFnLkdlb0tleURpcmVjdG9yeSkpO1xuICAgICAgICAgICAgcmVxdWlyZWRUYWdzLnB1c2godGhpcy5mZXRjaChUaWZmVGFnLkdlb0FzY2lpUGFyYW1zKSk7XG4gICAgICAgICAgICByZXF1aXJlZFRhZ3MucHVzaCh0aGlzLmZldGNoKFRpZmZUYWcuR2VvRG91YmxlUGFyYW1zKSk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChyZXF1aXJlZFRhZ3MpO1xuICAgICAgICBpZiAobG9hZEdlb1RhZ3MpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZEdlb1RpZmZUYWdzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIGEgVGlmZlRhZyBpZiBpdCBleGlzdHMgbnVsbCBvdGhlcndpc2VcbiAgICAgKi9cbiAgICB2YWx1ZTxUPih0YWc6IFRpZmZUYWcpOiBUIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHNvdXJjZVRhZyA9IHRoaXMudGFncy5nZXQodGFnKTtcbiAgICAgICAgaWYgKHNvdXJjZVRhZyA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIHNvdXJjZVRhZy52YWx1ZSBhcyBUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgYW5kIHVucGFjayB0aGUgR2VvS2V5RGlyZWN0b3J5XG4gICAgICovXG4gICAgYXN5bmMgbG9hZEdlb1RpZmZUYWdzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBBbHJlYWR5IGxvYWRlZFxuICAgICAgICBpZiAodGhpcy50YWdzR2VvTG9hZGVkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHNvdXJjZVRhZyA9IHRoaXMudGFncy5nZXQoVGlmZlRhZy5HZW9LZXlEaXJlY3RvcnkpO1xuICAgICAgICBpZiAoc291cmNlVGFnID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudGFnc0dlb0xvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzb3VyY2VUYWcuaXNSZWFkeSAmJiBzb3VyY2VUYWcgaW5zdGFuY2VvZiBDb2dUaWZmVGFnTGF6eSkge1xuICAgICAgICAgICAgLy8gTG9hZCBhbGwgdGhlIHJlcXVpcmVkIGtleXNcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuR2VvS2V5RGlyZWN0b3J5KSxcbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuR2VvQXNjaWlQYXJhbXMpLFxuICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2goVGlmZlRhZy5HZW9Eb3VibGVQYXJhbXMpLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50YWdzR2VvTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHNvdXJjZVRhZy52YWx1ZSA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGdlb1RhZ3MgPSBzb3VyY2VUYWcudmFsdWU7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShnZW9UYWdzKSkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGdlbyB0YWdzIGZvdW5kJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSA0OyBpIDw9IGdlb1RhZ3NbM10gKiA0OyBpICs9IDQpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGdlb1RhZ3NbaV0gYXMgVGlmZlRhZ0dlbztcbiAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gZ2VvVGFnc1tpICsgMV07XG5cbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGdlb1RhZ3NbaSArIDNdO1xuXG4gICAgICAgICAgICBpZiAobG9jYXRpb24gPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ3NHZW8uc2V0KGtleSwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHRoaXMudGFncy5nZXQobG9jYXRpb24pO1xuICAgICAgICAgICAgaWYgKHRhZyA9PSBudWxsIHx8IHRhZy52YWx1ZSA9PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gZ2VvVGFnc1tpICsgMl07XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0YWcudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50YWdzR2VvLnNldChrZXksIHRhZy52YWx1ZVtvZmZzZXQgKyBjb3VudCAtIDFdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRhZy52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ3NHZW8uc2V0KGtleSwgdGFnLnZhbHVlLnN1YnN0cihvZmZzZXQsIG9mZnNldCArIGNvdW50IC0gMSkudHJpbSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYXNzb2NpYXRlZCBHZW9UaWZmVGFnc1xuICAgICAqL1xuICAgIHZhbHVlR2VvKHRhZzogVGlmZlRhZ0dlbyk6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICh0aGlzLnRhZ3NHZW9Mb2FkZWQgPT09IGZhbHNlKSB0aHJvdyBuZXcgRXJyb3IoJ2xvYWRHZW9UaWZmVGFncygpIGhhcyBub3QgYmVlbiBjYWxsZWQnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFnc0dlby5nZXQodGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGEgdGFnLCBpZiBpdCBpcyBub3QgY3VycmVudGx5IGxvYWRlZCwgZmV0Y2ggdGhlIHJlcXVpcmVkIGRhdGEgZm9yIHRoZSB0YWcuXG4gICAgICogQHBhcmFtIHRhZyB0YWcgdG8gZmV0Y2hcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZmV0Y2g8VD4odGFnOiBUaWZmVGFnKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICAgICAgICBjb25zdCBzb3VyY2VUYWcgPSB0aGlzLnRhZ3MuZ2V0KHRhZyk7XG4gICAgICAgIGlmIChzb3VyY2VUYWcgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChDb2dUaWZmVGFnLmlzTGF6eShzb3VyY2VUYWcpKSByZXR1cm4gc291cmNlVGFnLmZldGNoKCkgYXMgYW55O1xuICAgICAgICByZXR1cm4gc291cmNlVGFnLnZhbHVlIGFzIFQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBvcmlnaW4gcG9pbnQgZm9yIHRoZSBpbWFnZVxuICAgICAqXG4gICAgICogQHJldHVybnMgb3JpZ2luIHBvaW50IG9mIHRoZSBpbWFnZVxuICAgICAqL1xuICAgIGdldCBvcmlnaW4oKTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgICAgICAgY29uc3QgdGllUG9pbnRzOiBudW1iZXJbXSB8IG51bGwgPSB0aGlzLnZhbHVlPG51bWJlcltdPihUaWZmVGFnLk1vZGVsVGllUG9pbnQpO1xuICAgICAgICBpZiAodGllUG9pbnRzICE9IG51bGwgJiYgdGllUG9pbnRzLmxlbmd0aCA9PT0gNikge1xuICAgICAgICAgICAgcmV0dXJuIFt0aWVQb2ludHNbM10sIHRpZVBvaW50c1s0XSwgdGllUG9pbnRzWzVdXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1vZGVsVHJhbnNmb3JtYXRpb24gPSB0aGlzLnZhbHVlPG51bWJlcltdPihUaWZmVGFnLk1vZGVsVHJhbnNmb3JtYXRpb24pO1xuICAgICAgICBpZiAobW9kZWxUcmFuc2Zvcm1hdGlvbiAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gW21vZGVsVHJhbnNmb3JtYXRpb25bM10sIG1vZGVsVHJhbnNmb3JtYXRpb25bN10sIG1vZGVsVHJhbnNmb3JtYXRpb25bMTFdXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBzdWIgaW1hZ2UsIHVzZSB0aGUgb3JpZ2luIGZyb20gdGhlIHRvcCBsZXZlbCBpbWFnZVxuICAgICAgICBpZiAodGhpcy52YWx1ZShUaWZmVGFnLk5ld1N1YkZpbGVUeXBlKSA9PT0gMSAmJiB0aGlzLmlkICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50aWYuaW1hZ2VzWzBdLm9yaWdpbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW1hZ2UgZG9lcyBub3QgaGF2ZSBhIGdlbyB0cmFuc2Zvcm1hdGlvbi4nKTtcbiAgICB9XG5cbiAgICAvKiogSXMgdGhlcmUgZW5vdWdoIGdlbyBpbmZvcm1hdGlvbiBvbiB0aGlzIGltYWdlIHRvIGZpZ3VyZSBvdXQgd2hlcmUgaXRzIGFjdHVhbGx5IGxvY2F0ZWQgKi9cbiAgICBnZXQgaXNHZW9Mb2NhdGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBpc0ltYWdlTG9jYXRlZCA9XG4gICAgICAgICAgICB0aGlzLnZhbHVlKFRpZmZUYWcuTW9kZWxQaXhlbFNjYWxlKSAhPSBudWxsIHx8IHRoaXMudmFsdWUoVGlmZlRhZy5Nb2RlbFRyYW5zZm9ybWF0aW9uKSAhPSBudWxsO1xuICAgICAgICBpZiAoaXNJbWFnZUxvY2F0ZWQpIHJldHVybiB0cnVlO1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgc3ViIGltYWdlLCB1c2UgdGhlIGlzR2VvTG9jYXRlZCBmcm9tIHRoZSB0b3AgbGV2ZWwgaW1hZ2VcbiAgICAgICAgaWYgKHRoaXMudmFsdWUoVGlmZlRhZy5OZXdTdWJGaWxlVHlwZSkgPT09IDEgJiYgdGhpcy5pZCAhPT0gMCkgcmV0dXJuIHRoaXMudGlmLmltYWdlc1swXS5pc0dlb0xvY2F0ZWQ7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHJlc29sdXRpb24gb2YgdGhlIGltYWdlXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBbeCx5LHpdIHBpeGVsIHNjYWxlXG4gICAgICovXG4gICAgZ2V0IHJlc29sdXRpb24oKTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgICAgICAgY29uc3QgbW9kZWxQaXhlbFNjYWxlOiBudW1iZXJbXSB8IG51bGwgPSB0aGlzLnZhbHVlKFRpZmZUYWcuTW9kZWxQaXhlbFNjYWxlKTtcbiAgICAgICAgaWYgKG1vZGVsUGl4ZWxTY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gW21vZGVsUGl4ZWxTY2FsZVswXSwgLW1vZGVsUGl4ZWxTY2FsZVsxXSwgbW9kZWxQaXhlbFNjYWxlWzJdXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtb2RlbFRyYW5zZm9ybWF0aW9uOiBudW1iZXJbXSB8IG51bGwgPSB0aGlzLnZhbHVlKFRpZmZUYWcuTW9kZWxUcmFuc2Zvcm1hdGlvbik7XG4gICAgICAgIGlmIChtb2RlbFRyYW5zZm9ybWF0aW9uICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBbbW9kZWxUcmFuc2Zvcm1hdGlvblswXSwgbW9kZWxUcmFuc2Zvcm1hdGlvbls1XSwgbW9kZWxUcmFuc2Zvcm1hdGlvblsxMF1dO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHN1YiBpbWFnZSwgdXNlIHRoZSByZXNvbHV0aW9uIGZyb20gdGhlIHRvcCBsZXZlbCBpbWFnZVxuICAgICAgICBpZiAodGhpcy52YWx1ZShUaWZmVGFnLk5ld1N1YkZpbGVUeXBlKSA9PT0gMSAmJiB0aGlzLmlkICE9PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdEltZyA9IHRoaXMudGlmLmltYWdlc1swXTtcbiAgICAgICAgICAgIGNvbnN0IFtyZXNYLCByZXNZLCByZXNaXSA9IGZpcnN0SW1nLnJlc29sdXRpb247XG4gICAgICAgICAgICBjb25zdCBmaXJzdEltZ1NpemUgPSBmaXJzdEltZy5zaXplO1xuICAgICAgICAgICAgY29uc3QgaW1nU2l6ZSA9IHRoaXMuc2l6ZTtcbiAgICAgICAgICAgIC8vIHNjYWxlIHJlc29sdXRpb24gYmFzZWQgb24gdGhlIHNpemUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gaW1hZ2VzXG4gICAgICAgICAgICByZXR1cm4gWyhyZXNYICogZmlyc3RJbWdTaXplLndpZHRoKSAvIGltZ1NpemUud2lkdGgsIChyZXNZICogZmlyc3RJbWdTaXplLmhlaWdodCkgLyBpbWdTaXplLmhlaWdodCwgcmVzWl07XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ltYWdlIGRvZXMgbm90IGhhdmUgYSBnZW8gdHJhbnNmb3JtYXRpb24uJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQm91bmRpbmcgYm94IG9mIHRoZSBpbWFnZVxuICAgICAqXG4gICAgICogQHJldHVybnMgW21pblgsIG1pblksIG1heFgsIG1heFldIGJvdW5kaW5nIGJveFxuICAgICAqL1xuICAgIGdldCBiYm94KCk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuc2l6ZTtcbiAgICAgICAgY29uc3Qgb3JpZ2luID0gdGhpcy5vcmlnaW47XG4gICAgICAgIGNvbnN0IHJlc29sdXRpb24gPSB0aGlzLnJlc29sdXRpb247XG5cbiAgICAgICAgaWYgKG9yaWdpbiA9PSBudWxsIHx8IHNpemUgPT0gbnVsbCB8fCByZXNvbHV0aW9uID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGNhbGN1bGF0ZSBib3VuZGluZyBib3gnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHgxID0gb3JpZ2luWzBdO1xuICAgICAgICBjb25zdCB5MSA9IG9yaWdpblsxXTtcblxuICAgICAgICBjb25zdCB4MiA9IHgxICsgcmVzb2x1dGlvblswXSAqIHNpemUud2lkdGg7XG4gICAgICAgIGNvbnN0IHkyID0geTEgKyByZXNvbHV0aW9uWzFdICogc2l6ZS5oZWlnaHQ7XG5cbiAgICAgICAgcmV0dXJuIFtNYXRoLm1pbih4MSwgeDIpLCBNYXRoLm1pbih5MSwgeTIpLCBNYXRoLm1heCh4MSwgeDIpLCBNYXRoLm1heCh5MSwgeTIpXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGNvbXByZXNzaW9uIHVzZWQgYnkgdGhlIHRpbGVcbiAgICAgKlxuICAgICAqIEBzZWUgVGlmZkNvbXByZXNzaW9uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBDb21wcmVzc2lvbiB0eXBlIGVnIHdlYnBcbiAgICAgKi9cbiAgICBnZXQgY29tcHJlc3Npb24oKTogVGlmZk1pbWVUeXBlIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGNvbXByZXNzaW9uID0gdGhpcy52YWx1ZShUaWZmVGFnLkNvbXByZXNzaW9uKTtcbiAgICAgICAgaWYgKGNvbXByZXNzaW9uID09IG51bGwgfHwgdHlwZW9mIGNvbXByZXNzaW9uICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFRpZmZDb21wcmVzc2lvbltjb21wcmVzc2lvbl07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXR0ZW1wdCB0byByZWFkIHRoZSBFUFNHIENvZGUgZnJvbSBUaWZmR2VvVGFnc1xuICAgICAqXG4gICAgICogQHJldHVybnMgRVBTRyBDb2RlIGlmIGl0IGV4aXN0c1xuICAgICAqL1xuICAgIGdldCBlcHNnKCk6IG51bWJlciB8IG51bGwge1xuICAgICAgICBjb25zdCBwcm9qZWN0aW9uID0gdGhpcy52YWx1ZUdlbyhUaWZmVGFnR2VvLlByb2plY3RlZENTVHlwZUdlb0tleSkgYXMgbnVtYmVyO1xuICAgICAgICBpZiAocHJvamVjdGlvbiA9PT0gSW52YWxpZFByb2plY3Rpb25Db2RlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIHByb2plY3Rpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBzaXplIG9mIHRoZSBpbWFnZVxuICAgICAqXG4gICAgICogQHJldHVybnMgU2l6ZSBpbiBwaXhlbHNcbiAgICAgKi9cbiAgICBnZXQgc2l6ZSgpOiBTaXplIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLnZhbHVlPG51bWJlcj4oVGlmZlRhZy5JbWFnZVdpZHRoKSBhcyBudW1iZXIsXG4gICAgICAgICAgICBoZWlnaHQ6IHRoaXMudmFsdWU8bnVtYmVyPihUaWZmVGFnLkltYWdlSGVpZ2h0KSBhcyBudW1iZXIsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBsaXN0IG9mIElGRCB0YWdzIHRoYXQgd2VyZSByZWFkXG4gICAgICovXG4gICAgZ2V0IHRhZ0xpc3QoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMudGFncy5rZXlzKCldLm1hcCgoYykgPT4gVGlmZlRhZ1tjXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lIGlmIHRoaXMgaW1hZ2UgaXMgdGlsZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNUaWxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUoVGlmZlRhZy5UaWxlV2lkdGgpICE9PSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBzaXplIG9mIGluZGl2aWR1YWwgdGlsZXNcbiAgICAgKi9cbiAgICBnZXQgdGlsZVNpemUoKTogQ29nVGlmZkltYWdlVGlsZVNpemUge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgd2lkdGg6IHRoaXMudmFsdWU8bnVtYmVyPihUaWZmVGFnLlRpbGVXaWR0aCkgYXMgbnVtYmVyLFxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLnZhbHVlPG51bWJlcj4oVGlmZlRhZy5UaWxlSGVpZ2h0KSBhcyBudW1iZXIsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIHRpbGVzIHVzZWQgdG8gY3JlYXRlIHRoaXMgaW1hZ2VcbiAgICAgKi9cbiAgICBnZXQgdGlsZUNvdW50KCk6IENvZ1RpZmZJbWFnZVRpbGVkQ291bnQge1xuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5zaXplO1xuICAgICAgICBjb25zdCB0aWxlU2l6ZSA9IHRoaXMudGlsZVNpemU7XG4gICAgICAgIGNvbnN0IHggPSBNYXRoLmNlaWwoc2l6ZS53aWR0aCAvIHRpbGVTaXplLndpZHRoKTtcbiAgICAgICAgY29uc3QgeSA9IE1hdGguY2VpbChzaXplLmhlaWdodCAvIHRpbGVTaXplLmhlaWdodCk7XG4gICAgICAgIHJldHVybiB7IHgsIHkgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHBvaW50ZXIgdG8gd2hlcmUgdGhlIHRpbGVzIHN0YXJ0IGluIHRoZSBUaWZmIGZpbGVcbiAgICAgKlxuICAgICAqIEByZW1hcmtzIFVzZWQgdG8gcmVhZCB0aWxlZCB0aWZmc1xuICAgICAqXG4gICAgICogQHJldHVybnMgZmlsZSBvZmZzZXQgdG8gd2hlcmUgdGhlIHRpZmZzIGFyZSBzdG9yZWRcbiAgICAgKi9cbiAgICBnZXQgdGlsZU9mZnNldCgpOiBDb2dUaWZmVGFnT2Zmc2V0IHtcbiAgICAgICAgY29uc3QgdGlsZU9mZnNldCA9IHRoaXMudGFncy5nZXQoVGlmZlRhZy5UaWxlT2Zmc2V0cykgYXMgQ29nVGlmZlRhZ09mZnNldDtcbiAgICAgICAgaWYgKHRpbGVPZmZzZXQgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdObyB0aWxlIG9mZnNldHMgZm91bmQnKTtcbiAgICAgICAgcmV0dXJuIHRpbGVPZmZzZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBudW1iZXIgb2Ygc3RyaXAncyBpbnNpZGUgdGhpcyB0aWZmXG4gICAgICpcbiAgICAgKiBAcmVtYXJrcyBVc2VkIHRvIHJlYWQgc3RyaXBlZCB0aWZmc1xuICAgICAqXG4gICAgICogQHJldHVybnMgbnVtYmVyIG9mIHN0cmlwcyBwcmVzZW50XG4gICAgICovXG4gICAgZ2V0IHN0cmlwQ291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdGlsZU9mZnNldCA9IHRoaXMudGFncy5nZXQoVGlmZlRhZy5TdHJpcEJ5dGVDb3VudHMpIGFzIENvZ1RpZmZUYWdPZmZzZXQ7XG4gICAgICAgIGlmICh0aWxlT2Zmc2V0ID09IG51bGwpIHJldHVybiAwO1xuICAgICAgICByZXR1cm4gdGlsZU9mZnNldC5kYXRhQ291bnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgcG9pbnRlciB0byBhIHNwZWNpZmljIHRpbGUgaW5zaWRlIHRoZSB0aWZmIGZpbGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbmRleCB0aWxlIGluZGV4XG4gICAgICogQHJldHVybnMgZmlsZSBvZmZzZXQgb2YgdGhlIHNwZWNpZmllZCB0aWxlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFzeW5jIGdldFRpbGVPZmZzZXQoaW5kZXg6IG51bWJlcik6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIGNvbnN0IHRpbGVPZmZzZXQgPSB0aGlzLnRpbGVPZmZzZXQ7XG4gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiB0aWxlT2Zmc2V0LmRhdGFDb3VudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaWxlIG9mZnNldDogJHtpbmRleH0gb3V0IG9mIHJhbmdlOiAwIC0+ICR7dGlsZU9mZnNldC5kYXRhQ291bnR9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGZXRjaCBvbmx5IHRoZSBwYXJ0IG9mIHRoZSBvZmZzZXRzIHRoYXQgYXJlIG5lZWRlZFxuICAgICAgICByZXR1cm4gdGlsZU9mZnNldC5nZXRWYWx1ZUF0KGluZGV4KTtcbiAgICB9XG5cbiAgICAvLyBDbGFtcCB0aGUgYm91bmRzIG9mIHRoZSBvdXRwdXQgaW1hZ2UgdG8gdGhlIHNpemUgb2YgdGhlIGltYWdlLCBhcyBzb21ldGltZXMgdGhlIGVkZ2UgdGlsZXMgYXJlIG5vdCBmdWxsIHRpbGVzXG4gICAgZ2V0VGlsZUJvdW5kcyh4OiBudW1iZXIsIHk6IG51bWJlcik6IEJvdW5kaW5nQm94IHtcbiAgICAgICAgY29uc3QgeyBzaXplLCB0aWxlU2l6ZSB9ID0gdGhpcztcbiAgICAgICAgY29uc3QgdG9wID0geSAqIHRpbGVTaXplLmhlaWdodDtcbiAgICAgICAgY29uc3QgbGVmdCA9IHggKiB0aWxlU2l6ZS53aWR0aDtcbiAgICAgICAgY29uc3Qgd2lkdGggPSBsZWZ0ICsgdGlsZVNpemUud2lkdGggPj0gc2l6ZS53aWR0aCA/IHNpemUud2lkdGggLSBsZWZ0IDogdGlsZVNpemUud2lkdGg7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHRvcCArIHRpbGVTaXplLmhlaWdodCA+PSBzaXplLmhlaWdodCA/IHNpemUuaGVpZ2h0IC0gdG9wIDogdGlsZVNpemUuaGVpZ2h0O1xuICAgICAgICByZXR1cm4geyB4OiBsZWZ0LCB5OiB0b3AsIHdpZHRoLCBoZWlnaHQgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgc3RyaXAgaW50byBhIHVpbnQ4IGFycmF5XG4gICAgICpcbiAgICAgKiBAcGFyYW0gaW5kZXggU3RyaXAgaW5kZXggdG8gcmVhZFxuICAgICAqL1xuICAgIGFzeW5jIGdldFN0cmlwKGluZGV4OiBudW1iZXIpOiBQcm9taXNlPHsgbWltZVR5cGU6IFRpZmZNaW1lVHlwZTsgYnl0ZXM6IFVpbnQ4QXJyYXkgfSB8IG51bGw+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNUaWxlZCgpKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIHN0cmlwZXMsIHRpZmYgaXMgdGlsZWQnKTtcblxuICAgICAgICBjb25zdCBieXRlQ291bnRzID0gdGhpcy50YWdzLmdldChUaWZmVGFnLlN0cmlwQnl0ZUNvdW50cykgYXMgQ29nVGlmZlRhZ09mZnNldDtcbiAgICAgICAgY29uc3Qgb2Zmc2V0cyA9IHRoaXMudGFncy5nZXQoVGlmZlRhZy5TdHJpcE9mZnNldHMpIGFzIENvZ1RpZmZUYWdPZmZzZXQ7XG5cbiAgICAgICAgaWYgKGluZGV4ID49IGJ5dGVDb3VudHMuZGF0YUNvdW50KSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIHN0cmlwLCBpbmRleCBvdXQgb2YgYm91bmRzJyk7XG5cbiAgICAgICAgY29uc3QgW2J5dGVDb3VudCwgb2Zmc2V0XSA9IGF3YWl0IFByb21pc2UuYWxsKFtvZmZzZXRzLmdldFZhbHVlQXQoaW5kZXgpLCBieXRlQ291bnRzLmdldFZhbHVlQXQoaW5kZXgpXSk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJ5dGVzKGJ5dGVDb3VudCwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICAvKiogVGhlIGpwZWcgaGVhZGVyIGlzIHN0b3JlZCBpbiB0aGUgSUZELCByZWFkIHRoZSBKUEVHIGhlYWRlciBhbmQgYWRqdXN0IHRoZSBieXRlIGFycmF5IHRvIGluY2x1ZGUgaXQgKi9cbiAgICBwcml2YXRlIGdldEpwZWdIZWFkZXIoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgICAgICAgLy8gQm90aCB0aGUgSlBFR1RhYmxlIGFuZCB0aGUgQnl0ZXMgd2l0aCBoYXZlIHRoZSBzdGFydCBvZiBpbWFnZSBhbmQgZW5kIG9mIGltYWdlIG1hcmtlcnNcbiAgICAgICAgLy8gU3RhcnRPZkltYWdlIDB4ZmZkOCBFbmRPZkltYWdlIDB4ZmZkOVxuICAgICAgICBjb25zdCB0YWJsZXMgPSB0aGlzLnZhbHVlPG51bWJlcltdPihUaWZmVGFnLkpQRUdUYWJsZXMpO1xuICAgICAgICBpZiAodGFibGVzID09IG51bGwpIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgSnBlZyBoZWFkZXInKTtcblxuICAgICAgICAvLyBSZW1vdmUgRW5kT2ZJbWFnZSBtYXJrZXJcbiAgICAgICAgY29uc3QgdGFibGVEYXRhID0gdGFibGVzLnNsaWNlKDAsIHRhYmxlcy5sZW5ndGggLSAyKTtcbiAgICAgICAgY29uc3QgYWN0dWFsQnl0ZXMgPSBuZXcgVWludDhBcnJheShieXRlcy5ieXRlTGVuZ3RoICsgdGFibGVEYXRhLmxlbmd0aCAtIDIpO1xuICAgICAgICBhY3R1YWxCeXRlcy5zZXQodGFibGVEYXRhLCAwKTtcbiAgICAgICAgYWN0dWFsQnl0ZXMuc2V0KGJ5dGVzLnNsaWNlKDIpLCB0YWJsZURhdGEubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIGFjdHVhbEJ5dGVzO1xuICAgIH1cblxuICAgIC8qKiBSZWFkIGltYWdlIGJ5dGVzIGF0IHRoZSBnaXZlbiBvZmZzZXQgKi9cbiAgICBwcml2YXRlIGFzeW5jIGdldEJ5dGVzKFxuICAgICAgICBvZmZzZXQ6IG51bWJlcixcbiAgICAgICAgYnl0ZUNvdW50OiBudW1iZXIsXG4gICAgKTogUHJvbWlzZTx7IG1pbWVUeXBlOiBUaWZmTWltZVR5cGU7IGJ5dGVzOiBVaW50OEFycmF5IH0gfCBudWxsPiB7XG4gICAgICAgIGNvbnN0IG1pbWVUeXBlID0gdGhpcy5jb21wcmVzc2lvbjtcbiAgICAgICAgaWYgKG1pbWVUeXBlID09IG51bGwpIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgY29tcHJlc3Npb246ICcgKyB0aGlzLnZhbHVlKFRpZmZUYWcuQ29tcHJlc3Npb24pKTtcbiAgICAgICAgaWYgKGJ5dGVDb3VudCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgYXdhaXQgdGhpcy50aWYuc291cmNlLmxvYWRCeXRlcyhvZmZzZXQsIGJ5dGVDb3VudCk7XG4gICAgICAgIGNvbnN0IGJ5dGVzID0gdGhpcy50aWYuc291cmNlLmJ5dGVzKG9mZnNldCwgYnl0ZUNvdW50KTtcblxuICAgICAgICBpZiAodGhpcy5jb21wcmVzc2lvbiA9PT0gVGlmZk1pbWVUeXBlLkpQRUcpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG1pbWVUeXBlLCBieXRlczogdGhpcy5nZXRKcGVnSGVhZGVyKGJ5dGVzKSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG1pbWVUeXBlLCBieXRlcyB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgdGhlIHRpbGUgYnVmZmVyLCB0aGlzIHdvcmtzIGJlc3Qgd2l0aCB3ZWJwXG4gICAgICpcbiAgICAgKiBUaGlzIHdpbGwgYWxzbyBhcHBseSB0aGUgSlBFRyBjb21wcmVzc2lvbiB0YWJsZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IFRpbGUgeCBvZmZzZXRcbiAgICAgKiBAcGFyYW0geSBUaWxlIHkgb2Zmc2V0XG4gICAgICovXG4gICAgYXN5bmMgZ2V0VGlsZSh4OiBudW1iZXIsIHk6IG51bWJlcik6IFByb21pc2U8eyBtaW1lVHlwZTogVGlmZk1pbWVUeXBlOyBieXRlczogVWludDhBcnJheSB9IHwgbnVsbD4ge1xuICAgICAgICBjb25zdCBtaW1lVHlwZSA9IHRoaXMuY29tcHJlc3Npb247XG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIGNvbnN0IHRpbGVzID0gdGhpcy50aWxlU2l6ZTtcblxuICAgICAgICBpZiAodGlsZXMgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdUaWZmIGlzIG5vdCB0aWxlZCcpO1xuICAgICAgICBpZiAobWltZVR5cGUgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBjb21wcmVzc2lvbjogJyArIHRoaXMudmFsdWUoVGlmZlRhZy5Db21wcmVzc2lvbikpO1xuXG4gICAgICAgIC8vIFRPRE8gc3VwcG9ydCBHaG9zdE9wdGlvblRpbGVPcmRlclxuICAgICAgICBjb25zdCBueVRpbGVzID0gTWF0aC5jZWlsKHNpemUuaGVpZ2h0IC8gdGlsZXMuaGVpZ2h0KTtcbiAgICAgICAgY29uc3QgbnhUaWxlcyA9IE1hdGguY2VpbChzaXplLndpZHRoIC8gdGlsZXMud2lkdGgpO1xuXG4gICAgICAgIGlmICh4ID49IG54VGlsZXMgfHwgeSA+PSBueVRpbGVzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRpbGUgaW5kZXggaXMgb3V0c2lkZSBvZiByYW5nZSB4OiR7eH0gPj0gJHtueFRpbGVzfSBvciB5OiR7eX0gPj0gJHtueVRpbGVzfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWR4ID0geSAqIG54VGlsZXMgKyB4O1xuICAgICAgICBjb25zdCB0b3RhbFRpbGVzID0gbnhUaWxlcyAqIG55VGlsZXM7XG4gICAgICAgIGlmIChpZHggPj0gdG90YWxUaWxlcykgdGhyb3cgbmV3IEVycm9yKGBUaWxlIGluZGV4IGlzIG91dHNpZGUgb2YgdGlsZSByYW5nZTogJHtpZHh9ID49ICR7dG90YWxUaWxlc31gKTtcblxuICAgICAgICBjb25zdCB7IG9mZnNldCwgaW1hZ2VTaXplIH0gPSBhd2FpdCB0aGlzLmdldFRpbGVTaXplKGlkeCk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJ5dGVzKG9mZnNldCwgaW1hZ2VTaXplKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2V0VGlsZVNpemUoaW5kZXg6IG51bWJlcik6IFByb21pc2U8eyBvZmZzZXQ6IG51bWJlcjsgaW1hZ2VTaXplOiBudW1iZXIgfT4ge1xuICAgICAgICAvLyBHREFMIG9wdGltaXplcyB0aWxlcyBieSBzdG9yaW5nIHRoZSBzaXplIG9mIHRoZSB0aWxlIGluXG4gICAgICAgIC8vIHRoZSBmZXcgYnl0ZXMgbGVhZGluZyB1cCB0byB0aGUgdGlsZVxuICAgICAgICBpZiAodGhpcy50aWYub3B0aW9ucy50aWxlTGVhZGVyQnl0ZVNpemUpIHtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGF3YWl0IHRoaXMuZ2V0VGlsZU9mZnNldChpbmRleCk7XG4gICAgICAgICAgICAvLyBTcGFyc2UgQ09HIG5vIGRhdGEgZm91bmRcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHJldHVybiB7IG9mZnNldDogMCwgaW1hZ2VTaXplOiAwIH07XG5cbiAgICAgICAgICAgIGNvbnN0IGxlYWRlckJ5dGVzID0gdGhpcy50aWYub3B0aW9ucy50aWxlTGVhZGVyQnl0ZVNpemU7XG4gICAgICAgICAgICAvLyBUaGlzIGZldGNoIHdpbGwgZ2VuZXJhbGx5IGxvYWQgaW4gdGhlIGJ5dGVzIG5lZWRlZCBmb3IgdGhlIGltYWdlIHRvb1xuICAgICAgICAgICAgLy8gcHJvdmlkZWQgdGhlIGltYWdlIHNpemUgaXMgbGVzcyB0aGFuIHRoZSBzaXplIG9mIGEgY2h1bmtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudGlmLnNvdXJjZS5sb2FkQnl0ZXMob2Zmc2V0IC0gbGVhZGVyQnl0ZXMsIGxlYWRlckJ5dGVzKTtcbiAgICAgICAgICAgIHJldHVybiB7IG9mZnNldCwgaW1hZ2VTaXplOiB0aGlzLnRpZi5zb3VyY2UuZ2V0VWludChvZmZzZXQgLSBsZWFkZXJCeXRlcywgbGVhZGVyQnl0ZXMpIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBieXRlQ291bnRzID0gdGhpcy50YWdzLmdldChUaWZmVGFnLlRpbGVCeXRlQ291bnRzKSBhcyBDb2dUaWZmVGFnT2Zmc2V0O1xuICAgICAgICBpZiAoYnl0ZUNvdW50cyA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHRpbGUgYnl0ZSBjb3VudHMgZm91bmQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBbb2Zmc2V0LCBpbWFnZVNpemVdID0gYXdhaXQgUHJvbWlzZS5hbGwoW3RoaXMuZ2V0VGlsZU9mZnNldChpbmRleCksIGJ5dGVDb3VudHMuZ2V0VmFsdWVBdChpbmRleCldKTtcbiAgICAgICAgcmV0dXJuIHsgb2Zmc2V0LCBpbWFnZVNpemUgfTtcbiAgICB9XG59XG4iXX0=
|
package/build/cog.tiff.js
CHANGED
|
@@ -26,23 +26,23 @@ export class CogTiff {
|
|
|
26
26
|
*
|
|
27
27
|
* @param loadGeoKeys Whether to also initialize the GeoKeyDirectory
|
|
28
28
|
*/
|
|
29
|
-
init(loadGeoKeys = false
|
|
29
|
+
init(loadGeoKeys = false) {
|
|
30
30
|
if (this._initPromise)
|
|
31
31
|
return this._initPromise;
|
|
32
|
-
this._initPromise = this.doInit(loadGeoKeys
|
|
32
|
+
this._initPromise = this.doInit(loadGeoKeys);
|
|
33
33
|
return this._initPromise;
|
|
34
34
|
}
|
|
35
|
-
async doInit(loadGeoKeys = false
|
|
35
|
+
async doInit(loadGeoKeys = false) {
|
|
36
36
|
if (this.isInitialized)
|
|
37
37
|
return this;
|
|
38
38
|
// Load the first few KB in, more loads will run as more data is required
|
|
39
|
-
await this.source.loadBytes(0, this.source.chunkSize
|
|
40
|
-
await this.fetchIfd(
|
|
41
|
-
await Promise.all(this.images.map((c) => c.init(loadGeoKeys
|
|
39
|
+
await this.source.loadBytes(0, this.source.chunkSize);
|
|
40
|
+
await this.fetchIfd();
|
|
41
|
+
await Promise.all(this.images.map((c) => c.init(loadGeoKeys)));
|
|
42
42
|
this.isInitialized = true;
|
|
43
43
|
return this;
|
|
44
44
|
}
|
|
45
|
-
async fetchIfd(
|
|
45
|
+
async fetchIfd() {
|
|
46
46
|
const view = this.cursor.seekTo(0);
|
|
47
47
|
const endian = view.uint16();
|
|
48
48
|
this.source.isLittleEndian = endian === TiffEndian.Little;
|
|
@@ -69,10 +69,13 @@ export class CogTiff {
|
|
|
69
69
|
const ghostSize = nextOffsetIfd - this.cursor.currentOffset;
|
|
70
70
|
// GDAL now stores metadata between the IFD inside a ghost storage area
|
|
71
71
|
if (ghostSize > 0 && ghostSize < 16 * 1024) {
|
|
72
|
-
|
|
72
|
+
// logger?.debug(
|
|
73
|
+
// { offset: toHexString(this.cursor.currentOffset), length: toHexString(ghostSize) },
|
|
74
|
+
// 'GhostOptions',
|
|
75
|
+
// );
|
|
73
76
|
// this.options.process(this.source, view.currentOffset, ghostSize);
|
|
74
77
|
}
|
|
75
|
-
return this.processIfd(nextOffsetIfd
|
|
78
|
+
return this.processIfd(nextOffsetIfd);
|
|
76
79
|
}
|
|
77
80
|
getImage(z) {
|
|
78
81
|
return this.images[z];
|
|
@@ -116,58 +119,27 @@ export class CogTiff {
|
|
|
116
119
|
throw new Error('Tif is not tiled');
|
|
117
120
|
return image.getTile(x, y);
|
|
118
121
|
}
|
|
119
|
-
async processIfd(offset
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
}
|
|
124
|
-
const { image, nextOffset } = await this.readIfd(offset, logger);
|
|
122
|
+
async processIfd(offset) {
|
|
123
|
+
if (!this.source.hasBytes(offset, 4096))
|
|
124
|
+
await this.source.loadBytes(offset, 4096);
|
|
125
|
+
const { image, nextOffset } = await this.readIfd(offset);
|
|
125
126
|
this.images.push(image);
|
|
126
|
-
const size = image.size;
|
|
127
|
-
if (image.isTiled()) {
|
|
128
|
-
const tile = image.tileSize;
|
|
129
|
-
logger === null || logger === void 0 ? void 0 : logger.debug({
|
|
130
|
-
...size,
|
|
131
|
-
tileWidth: tile.width,
|
|
132
|
-
tileHeight: tile.height,
|
|
133
|
-
tileCount: Math.ceil(size.width / tile.width),
|
|
134
|
-
}, 'GotImage');
|
|
135
|
-
}
|
|
136
127
|
if (nextOffset)
|
|
137
|
-
await this.processIfd(nextOffset
|
|
128
|
+
await this.processIfd(nextOffset);
|
|
138
129
|
}
|
|
139
|
-
async readIfd(offset
|
|
130
|
+
async readIfd(offset) {
|
|
140
131
|
if (!this.source.hasBytes(offset, 1024))
|
|
141
|
-
await this.source.loadBytes(offset, this.source.chunkSize
|
|
132
|
+
await this.source.loadBytes(offset, this.source.chunkSize);
|
|
142
133
|
const view = this.cursor.seekTo(offset);
|
|
143
134
|
const tagCount = view.offset();
|
|
144
135
|
const byteStart = offset + this.ifdConfig.offset;
|
|
145
|
-
const logger = log === null || log === void 0 ? void 0 : log.child({ imageId: this.images.length });
|
|
146
136
|
const tags = new Map();
|
|
147
137
|
let pos = byteStart;
|
|
148
138
|
for (let i = 0; i < tagCount; i++) {
|
|
149
139
|
const tag = CogTiffTag.create(this, pos);
|
|
150
140
|
pos += tag.size;
|
|
151
|
-
if (tag.name == null)
|
|
152
|
-
|
|
153
|
-
continue;
|
|
154
|
-
}
|
|
155
|
-
if (!tag.isReady) {
|
|
156
|
-
logger === null || logger === void 0 ? void 0 : logger.trace({
|
|
157
|
-
offset: toHexString(pos - offset),
|
|
158
|
-
code: toHexString(tag.id),
|
|
159
|
-
tagName: tag.name,
|
|
160
|
-
ptr: toHexString(tag.valuePointer),
|
|
161
|
-
}, 'PartialReadIFD');
|
|
162
|
-
}
|
|
163
|
-
else {
|
|
164
|
-
logger === null || logger === void 0 ? void 0 : logger.trace({
|
|
165
|
-
offset: toHexString(pos - offset),
|
|
166
|
-
code: toHexString(tag.id),
|
|
167
|
-
tagName: tag.name,
|
|
168
|
-
value: Array.isArray(tag.value) ? `[${tag.value.length}]` : tag.value,
|
|
169
|
-
}, 'ReadIFD');
|
|
170
|
-
}
|
|
141
|
+
if (tag.name == null)
|
|
142
|
+
throw new Error('Unknown IFD Tag: ' + toHexString(tag.id));
|
|
171
143
|
tags.set(tag.id, tag);
|
|
172
144
|
}
|
|
173
145
|
const image = new CogTiffImage(this, this.images.length, tags);
|
|
@@ -180,4 +152,4 @@ export class CogTiff {
|
|
|
180
152
|
await ((_b = (_a = this.source) === null || _a === void 0 ? void 0 : _a.close) === null || _b === void 0 ? void 0 : _b.call(_a));
|
|
181
153
|
}
|
|
182
154
|
}
|
|
183
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nLnRpZmYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29nLnRpZmYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVwRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFdEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBaUIsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzlELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVqRCxNQUFNLE9BQU8sT0FBTztJQVNoQixZQUFZLE1BQW1CO1FBUC9CLFlBQU8sR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDO1FBQzNCLFdBQU0sR0FBbUIsRUFBRSxDQUFDO1FBQzVCLFlBQU8sR0FBRyxJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFHbkMsY0FBUyxHQUFrQixhQUFhLENBQUM7UUFZekMsNkJBQTZCO1FBQzdCLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBVmxCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELHNDQUFzQztJQUN0QyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQW1CO1FBQzdCLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQU1EOzs7O09BSUc7SUFDSCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssRUFBRSxNQUFnQjtRQUN0QyxJQUFJLElBQUksQ0FBQyxZQUFZO1lBQUUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ2hELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDckQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzdCLENBQUM7SUFFTyxLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsR0FBRyxLQUFLLEVBQUUsTUFBZ0I7UUFDdEQsSUFBSSxJQUFJLENBQUMsYUFBYTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3BDLHlFQUF5RTtRQUN6RSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM5RCxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUIsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdkUsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVPLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBZ0I7UUFDbkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxHQUFHLE1BQU0sS0FBSyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQzFELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7UUFDcEYsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFN0IsSUFBSSxhQUFxQixDQUFDO1FBQzFCLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxXQUFXLENBQUMsT0FBTyxFQUFFO1lBQ3RDLElBQUksQ0FBQyxTQUFTLEdBQUcsZ0JBQWdCLENBQUM7WUFDbEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xDLElBQUksV0FBVyxLQUFLLENBQUM7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1lBQzVFLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM1QixJQUFJLEtBQUssS0FBSyxDQUFDO2dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztZQUM1RCxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2xDO2FBQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLFdBQVcsQ0FBQyxJQUFJLEVBQUU7WUFDMUMsYUFBYSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNsQzthQUFNO1lBQ0gsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7U0FDbEU7UUFFRCxNQUFNLFNBQVMsR0FBRyxhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUM7UUFDNUQsdUVBQXVFO1FBQ3ZFLElBQUksU0FBUyxHQUFHLENBQUMsSUFBSSxTQUFTLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRTtZQUN4QyxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsS0FBSyxDQUNULEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFDbEYsY0FBYyxDQUNqQixDQUFDO1lBQ0Ysb0VBQW9FO1NBQ3ZFO1FBRUQsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsUUFBUSxDQUFDLENBQVM7UUFDZCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxvQkFBb0IsQ0FBQyxVQUFrQjtRQUNuQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDdkMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUM7UUFFckMsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUM7UUFDcEQsd0RBQXdEO1FBQ3hELEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDN0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO1lBRXpCLE1BQU0sY0FBYyxHQUFHLGVBQWUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQ3ZELHFDQUFxQztZQUNyQywyREFBMkQ7WUFFM0QsSUFBSSxjQUFjLEdBQUcsVUFBVSxJQUFJLElBQUk7Z0JBQUUsT0FBTyxHQUFHLENBQUM7U0FDdkQ7UUFDRCxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsS0FBYTtRQUM3QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLElBQUksS0FBSyxJQUFJLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGNBQWMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUUxRCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFTyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQWMsRUFBRSxNQUFnQjtRQUNyRCxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFFbEUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNyQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDckQ7UUFFRCxNQUFNLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztRQUN4QixJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNqQixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1lBQzVCLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxLQUFLLENBQ1Q7Z0JBQ0ksR0FBRyxJQUFJO2dCQUNQLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSztnQkFDckIsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNO2dCQUN2QixTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7YUFDaEQsRUFDRCxVQUFVLENBQ2IsQ0FBQztTQUNMO1FBRUQsSUFBSSxVQUFVO1lBQUUsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFjLEVBQUUsR0FBYTtRQUMvQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztZQUFFLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3pHLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMvQixNQUFNLFNBQVMsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7UUFDakQsTUFBTSxNQUFNLEdBQUcsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDM0QsTUFBTSxJQUFJLEdBQWlDLElBQUksR0FBRyxFQUFFLENBQUM7UUFFckQsSUFBSSxHQUFHLEdBQUcsU0FBUyxDQUFDO1FBQ3BCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDL0IsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDekMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFFaEIsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUksRUFBRTtnQkFDbEIsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7Z0JBQzNELFNBQVM7YUFDWjtZQUVELElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFO2dCQUNkLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxLQUFLLENBQ1Q7b0JBQ0ksTUFBTSxFQUFFLFdBQVcsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDO29CQUNqQyxJQUFJLEVBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3pCLE9BQU8sRUFBRSxHQUFHLENBQUMsSUFBSTtvQkFDakIsR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDO2lCQUNyQyxFQUNELGdCQUFnQixDQUNuQixDQUFDO2FBQ0w7aUJBQU07Z0JBQ0gsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLEtBQUssQ0FDVDtvQkFDSSxNQUFNLEVBQUUsV0FBVyxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUM7b0JBQ2pDLElBQUksRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDekIsT0FBTyxFQUFFLEdBQUcsQ0FBQyxJQUFJO29CQUNqQixLQUFLLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUs7aUJBQ3hFLEVBQ0QsU0FBUyxDQUNaLENBQUM7YUFDTDtZQUVELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUN6QjtRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMvRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxnREFBZ0Q7SUFDaEQsS0FBSyxDQUFDLEtBQUs7O1FBQ1AsTUFBTSxDQUFBLE1BQUEsTUFBQSxJQUFJLENBQUMsTUFBTSwwQ0FBRSxLQUFLLGtEQUFJLENBQUEsQ0FBQztJQUNqQyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaHVua1NvdXJjZSwgTG9nVHlwZSB9IGZyb20gJ0BjaHVua2QvY29yZSc7XG5pbXBvcnQgeyBDb2dUaWZmSW1hZ2UgfSBmcm9tICcuL2NvZy50aWZmLmltYWdlLmpzJztcbmltcG9ydCB7IFRpZmZFbmRpYW4gfSBmcm9tICcuL2NvbnN0L3RpZmYuZW5kaWFuLmpzJztcbmltcG9ydCB7IFRpZmZUYWcgfSBmcm9tICcuL2NvbnN0L3RpZmYudGFnLmlkLmpzJztcbmltcG9ydCB7IFRpZmZWZXJzaW9uIH0gZnJvbSAnLi9jb25zdC90aWZmLnZlcnNpb24uanMnO1xuaW1wb3J0IHsgQ29nVGlmZlRhZ0Jhc2UgfSBmcm9tICcuL3JlYWQvdGFnL3RpZmYudGFnLmJhc2UuanMnO1xuaW1wb3J0IHsgQ29nVGlmR2hvc3RPcHRpb25zIH0gZnJvbSAnLi9yZWFkL3RpZmYuZ2RhbC5qcyc7XG5pbXBvcnQgeyBUYWdUaWZmQmlnQ29uZmlnLCBUYWdUaWZmQ29uZmlnLCBUaWZmSWZkQ29uZmlnIH0gZnJvbSAnLi9yZWFkL3RpZmYuaWZkLmNvbmZpZy5qcyc7XG5pbXBvcnQgeyBDb2dUaWZmVGFnIH0gZnJvbSAnLi9yZWFkL3RpZmYudGFnLmpzJztcbmltcG9ydCB7IENvZ1NvdXJjZUN1cnNvciB9IGZyb20gJy4vc291cmNlL2NvZy5zb3VyY2Uudmlldy5qcyc7XG5pbXBvcnQgeyB0b0hleFN0cmluZyB9IGZyb20gJy4vdXRpbC91dGlsLmhleC5qcyc7XG5cbmV4cG9ydCBjbGFzcyBDb2dUaWZmIHtcbiAgICBzb3VyY2U6IENodW5rU291cmNlO1xuICAgIHZlcnNpb24gPSBUaWZmVmVyc2lvbi5UaWZmO1xuICAgIGltYWdlczogQ29nVGlmZkltYWdlW10gPSBbXTtcbiAgICBvcHRpb25zID0gbmV3IENvZ1RpZkdob3N0T3B0aW9ucygpO1xuXG4gICAgcHJpdmF0ZSBjdXJzb3I6IENvZ1NvdXJjZUN1cnNvcjtcbiAgICBpZmRDb25maWc6IFRpZmZJZmRDb25maWcgPSBUYWdUaWZmQ29uZmlnO1xuXG4gICAgY29uc3RydWN0b3Ioc291cmNlOiBDaHVua1NvdXJjZSkge1xuICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgICAgdGhpcy5jdXJzb3IgPSBuZXcgQ29nU291cmNlQ3Vyc29yKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgYSBDb2dUaWZmICovXG4gICAgc3RhdGljIGNyZWF0ZShzb3VyY2U6IENodW5rU291cmNlKTogUHJvbWlzZTxDb2dUaWZmPiB7XG4gICAgICAgIHJldHVybiBuZXcgQ29nVGlmZihzb3VyY2UpLmluaXQoKTtcbiAgICB9XG5cbiAgICAvKiogSGFzIGluaXQoKSBiZWVuIGNhbGxlZCAqL1xuICAgIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAgIF9pbml0UHJvbWlzZT86IFByb21pc2U8Q29nVGlmZj47XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSB0aGUgQ09HIGxvYWRpbmcgaW4gdGhlIGhlYWRlciBhbmQgYWxsIGltYWdlIGhlYWRlcnNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBsb2FkR2VvS2V5cyBXaGV0aGVyIHRvIGFsc28gaW5pdGlhbGl6ZSB0aGUgR2VvS2V5RGlyZWN0b3J5XG4gICAgICovXG4gICAgaW5pdChsb2FkR2VvS2V5cyA9IGZhbHNlLCBsb2dnZXI/OiBMb2dUeXBlKTogUHJvbWlzZTxDb2dUaWZmPiB7XG4gICAgICAgIGlmICh0aGlzLl9pbml0UHJvbWlzZSkgcmV0dXJuIHRoaXMuX2luaXRQcm9taXNlO1xuICAgICAgICB0aGlzLl9pbml0UHJvbWlzZSA9IHRoaXMuZG9Jbml0KGxvYWRHZW9LZXlzLCBsb2dnZXIpO1xuICAgICAgICByZXR1cm4gdGhpcy5faW5pdFByb21pc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBkb0luaXQobG9hZEdlb0tleXMgPSBmYWxzZSwgbG9nZ2VyPzogTG9nVHlwZSk6IFByb21pc2U8Q29nVGlmZj4ge1xuICAgICAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKSByZXR1cm4gdGhpcztcbiAgICAgICAgLy8gTG9hZCB0aGUgZmlyc3QgZmV3IEtCIGluLCBtb3JlIGxvYWRzIHdpbGwgcnVuIGFzIG1vcmUgZGF0YSBpcyByZXF1aXJlZFxuICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZS5sb2FkQnl0ZXMoMCwgdGhpcy5zb3VyY2UuY2h1bmtTaXplLCBsb2dnZXIpO1xuICAgICAgICBhd2FpdCB0aGlzLmZldGNoSWZkKGxvZ2dlcik7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMuaW1hZ2VzLm1hcCgoYykgPT4gYy5pbml0KGxvYWRHZW9LZXlzLCBsb2dnZXIpKSk7XG5cbiAgICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBmZXRjaElmZChsb2dnZXI/OiBMb2dUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLmN1cnNvci5zZWVrVG8oMCk7XG4gICAgICAgIGNvbnN0IGVuZGlhbiA9IHZpZXcudWludDE2KCk7XG4gICAgICAgIHRoaXMuc291cmNlLmlzTGl0dGxlRW5kaWFuID0gZW5kaWFuID09PSBUaWZmRW5kaWFuLkxpdHRsZTtcbiAgICAgICAgaWYgKCF0aGlzLnNvdXJjZS5pc0xpdHRsZUVuZGlhbikgdGhyb3cgbmV3IEVycm9yKCdPbmx5IGxpdHRsZSBlbmRpYW4gaXMgc3VwcG9ydGVkJyk7XG4gICAgICAgIHRoaXMudmVyc2lvbiA9IHZpZXcudWludDE2KCk7XG5cbiAgICAgICAgbGV0IG5leHRPZmZzZXRJZmQ6IG51bWJlcjtcbiAgICAgICAgaWYgKHRoaXMudmVyc2lvbiA9PT0gVGlmZlZlcnNpb24uQmlnVGlmZikge1xuICAgICAgICAgICAgdGhpcy5pZmRDb25maWcgPSBUYWdUaWZmQmlnQ29uZmlnO1xuICAgICAgICAgICAgY29uc3QgcG9pbnRlclNpemUgPSB2aWV3LnVpbnQxNigpO1xuICAgICAgICAgICAgaWYgKHBvaW50ZXJTaXplICE9PSA4KSB0aHJvdyBuZXcgRXJyb3IoJ09ubHkgOGJ5dGUgcG9pbnRlcnMgYXJlIHN1cHBvcnRlZCcpO1xuICAgICAgICAgICAgY29uc3QgemVyb3MgPSB2aWV3LnVpbnQxNigpO1xuICAgICAgICAgICAgaWYgKHplcm9zICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYmlnIHRpZmYgaGVhZGVyJyk7XG4gICAgICAgICAgICBuZXh0T2Zmc2V0SWZkID0gdmlldy5wb2ludGVyKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy52ZXJzaW9uID09PSBUaWZmVmVyc2lvbi5UaWZmKSB7XG4gICAgICAgICAgICBuZXh0T2Zmc2V0SWZkID0gdmlldy5wb2ludGVyKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9ubHkgdGlmZiBzdXBwb3J0ZWQgdmVyc2lvbjoke3RoaXMudmVyc2lvbn1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdob3N0U2l6ZSA9IG5leHRPZmZzZXRJZmQgLSB0aGlzLmN1cnNvci5jdXJyZW50T2Zmc2V0O1xuICAgICAgICAvLyBHREFMIG5vdyBzdG9yZXMgbWV0YWRhdGEgYmV0d2VlbiB0aGUgSUZEIGluc2lkZSBhIGdob3N0IHN0b3JhZ2UgYXJlYVxuICAgICAgICBpZiAoZ2hvc3RTaXplID4gMCAmJiBnaG9zdFNpemUgPCAxNiAqIDEwMjQpIHtcbiAgICAgICAgICAgIGxvZ2dlcj8uZGVidWcoXG4gICAgICAgICAgICAgICAgeyBvZmZzZXQ6IHRvSGV4U3RyaW5nKHRoaXMuY3Vyc29yLmN1cnJlbnRPZmZzZXQpLCBsZW5ndGg6IHRvSGV4U3RyaW5nKGdob3N0U2l6ZSkgfSxcbiAgICAgICAgICAgICAgICAnR2hvc3RPcHRpb25zJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyB0aGlzLm9wdGlvbnMucHJvY2Vzcyh0aGlzLnNvdXJjZSwgdmlldy5jdXJyZW50T2Zmc2V0LCBnaG9zdFNpemUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0lmZChuZXh0T2Zmc2V0SWZkLCBsb2dnZXIpO1xuICAgIH1cblxuICAgIGdldEltYWdlKHo6IG51bWJlcik6IENvZ1RpZmZJbWFnZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmltYWdlc1t6XTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kIGEgaW1hZ2Ugd2hpY2ggaGFzIGEgcmVzb2x1dGlvbiBzaW1pbGFyIHRvIHRoZSBwcm92aWRlZCByZXNvbHV0aW9uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzb2x1dGlvbiByZXNvbHV0aW9uIHRvIGZpbmRcbiAgICAgKi9cbiAgICBnZXRJbWFnZUJ5UmVzb2x1dGlvbihyZXNvbHV0aW9uOiBudW1iZXIpOiBDb2dUaWZmSW1hZ2Uge1xuICAgICAgICBjb25zdCBmaXJzdEltYWdlID0gdGhpcy5pbWFnZXNbMF07XG4gICAgICAgIGNvbnN0IGZpcnN0SW1hZ2VTaXplID0gZmlyc3RJbWFnZS5zaXplO1xuICAgICAgICBjb25zdCBbcmVmWF0gPSBmaXJzdEltYWdlLnJlc29sdXRpb247XG5cbiAgICAgICAgY29uc3QgcmVzb2x1dGlvbkJhc2VYID0gcmVmWCAqIGZpcnN0SW1hZ2VTaXplLndpZHRoO1xuICAgICAgICAvLyBjb25zdCByZXNvbHV0aW9uQmFzZVkgPSByZWZZICogZmlyc3RJbWFnZVNpemUuaGVpZ2h0O1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5pbWFnZXMubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgaW1nID0gdGhpcy5pbWFnZXNbaV07XG4gICAgICAgICAgICBjb25zdCBpbWdTaXplID0gaW1nLnNpemU7XG5cbiAgICAgICAgICAgIGNvbnN0IGltZ1Jlc29sdXRpb25YID0gcmVzb2x1dGlvbkJhc2VYIC8gaW1nU2l6ZS53aWR0aDtcbiAgICAgICAgICAgIC8vIFRPRE8gZG8gd2UgY2FyZSBhYm91dCB5IHJlc29sdXRpb25cbiAgICAgICAgICAgIC8vIGNvbnN0IGltZ1Jlc29sdXRpb25ZID0gcmVzb2x1dGlvbkJhc2VZIC8gaW1nU2l6ZS5oZWlnaHQ7XG5cbiAgICAgICAgICAgIGlmIChpbWdSZXNvbHV0aW9uWCAtIHJlc29sdXRpb24gPD0gMC4wMSkgcmV0dXJuIGltZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlyc3RJbWFnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHJhdyBieXRlcyBmb3IgYSB0aWxlIGF0IGEgZ2l2ZW4geCx5LCBpbmRleC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWF5IHJldHVybiBudWxsIGlmIHRoZSB0aWxlIGRvZXMgbm90IGV4aXN0IGVnIFNwYXJzZSBjb2dzLFxuICAgICAqXG4gICAgICogQHBhcmFtIHggdGlsZSB4IGluZGV4XG4gICAgICogQHBhcmFtIHkgdGlsZSB5IGluZGV4XG4gICAgICogQHBhcmFtIGluZGV4IGltYWdlIGluZGV4XG4gICAgICovXG4gICAgYXN5bmMgZ2V0VGlsZSh4OiBudW1iZXIsIHk6IG51bWJlciwgaW5kZXg6IG51bWJlcik6IFByb21pc2U8eyBtaW1lVHlwZTogc3RyaW5nOyBieXRlczogVWludDhBcnJheSB9IHwgbnVsbD4ge1xuICAgICAgICBjb25zdCBpbWFnZSA9IHRoaXMuZ2V0SW1hZ2UoaW5kZXgpO1xuICAgICAgICBpZiAoaW1hZ2UgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHo6ICR7aW5kZXh9YCk7XG4gICAgICAgIGlmICghaW1hZ2UuaXNUaWxlZCgpKSB0aHJvdyBuZXcgRXJyb3IoJ1RpZiBpcyBub3QgdGlsZWQnKTtcblxuICAgICAgICByZXR1cm4gaW1hZ2UuZ2V0VGlsZSh4LCB5KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHByb2Nlc3NJZmQob2Zmc2V0OiBudW1iZXIsIGxvZ2dlcj86IExvZ1R5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbG9nZ2VyPy50cmFjZSh7IG9mZnNldDogdG9IZXhTdHJpbmcob2Zmc2V0KSB9LCAnTmV4dEltYWdlT2Zmc2V0Jyk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnNvdXJjZS5oYXNCeXRlcyhvZmZzZXQsIDQwOTYpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZS5sb2FkQnl0ZXMob2Zmc2V0LCA0MDk2LCBsb2dnZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBpbWFnZSwgbmV4dE9mZnNldCB9ID0gYXdhaXQgdGhpcy5yZWFkSWZkKG9mZnNldCwgbG9nZ2VyKTtcbiAgICAgICAgdGhpcy5pbWFnZXMucHVzaChpbWFnZSk7XG4gICAgICAgIGNvbnN0IHNpemUgPSBpbWFnZS5zaXplO1xuICAgICAgICBpZiAoaW1hZ2UuaXNUaWxlZCgpKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gaW1hZ2UudGlsZVNpemU7XG4gICAgICAgICAgICBsb2dnZXI/LmRlYnVnKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgdGlsZVdpZHRoOiB0aWxlLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICB0aWxlSGVpZ2h0OiB0aWxlLmhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgdGlsZUNvdW50OiBNYXRoLmNlaWwoc2l6ZS53aWR0aCAvIHRpbGUud2lkdGgpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgJ0dvdEltYWdlJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dE9mZnNldCkgYXdhaXQgdGhpcy5wcm9jZXNzSWZkKG5leHRPZmZzZXQsIGxvZ2dlcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZWFkSWZkKG9mZnNldDogbnVtYmVyLCBsb2c/OiBMb2dUeXBlKTogUHJvbWlzZTx7IG5leHRPZmZzZXQ6IG51bWJlcjsgaW1hZ2U6IENvZ1RpZmZJbWFnZSB9PiB7XG4gICAgICAgIGlmICghdGhpcy5zb3VyY2UuaGFzQnl0ZXMob2Zmc2V0LCAxMDI0KSkgYXdhaXQgdGhpcy5zb3VyY2UubG9hZEJ5dGVzKG9mZnNldCwgdGhpcy5zb3VyY2UuY2h1bmtTaXplLCBsb2cpO1xuICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy5jdXJzb3Iuc2Vla1RvKG9mZnNldCk7XG4gICAgICAgIGNvbnN0IHRhZ0NvdW50ID0gdmlldy5vZmZzZXQoKTtcbiAgICAgICAgY29uc3QgYnl0ZVN0YXJ0ID0gb2Zmc2V0ICsgdGhpcy5pZmRDb25maWcub2Zmc2V0O1xuICAgICAgICBjb25zdCBsb2dnZXIgPSBsb2c/LmNoaWxkKHsgaW1hZ2VJZDogdGhpcy5pbWFnZXMubGVuZ3RoIH0pO1xuICAgICAgICBjb25zdCB0YWdzOiBNYXA8VGlmZlRhZywgQ29nVGlmZlRhZ0Jhc2U+ID0gbmV3IE1hcCgpO1xuXG4gICAgICAgIGxldCBwb3MgPSBieXRlU3RhcnQ7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gQ29nVGlmZlRhZy5jcmVhdGUodGhpcywgcG9zKTtcbiAgICAgICAgICAgIHBvcyArPSB0YWcuc2l6ZTtcblxuICAgICAgICAgICAgaWYgKHRhZy5uYW1lID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXI/LmVycm9yKHsgY29kZTogdG9IZXhTdHJpbmcodGFnLmlkKSB9LCBgSUZEVW5rbm93bmApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRhZy5pc1JlYWR5KSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyPy50cmFjZShcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiB0b0hleFN0cmluZyhwb3MgLSBvZmZzZXQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogdG9IZXhTdHJpbmcodGFnLmlkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ05hbWU6IHRhZy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHRyOiB0b0hleFN0cmluZyh0YWcudmFsdWVQb2ludGVyKSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgJ1BhcnRpYWxSZWFkSUZEJyxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2dnZXI/LnRyYWNlKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRvSGV4U3RyaW5nKHBvcyAtIG9mZnNldCksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiB0b0hleFN0cmluZyh0YWcuaWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFnTmFtZTogdGFnLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogQXJyYXkuaXNBcnJheSh0YWcudmFsdWUpID8gYFske3RhZy52YWx1ZS5sZW5ndGh9XWAgOiB0YWcudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICdSZWFkSUZEJyxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0YWdzLnNldCh0YWcuaWQsIHRhZyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbWFnZSA9IG5ldyBDb2dUaWZmSW1hZ2UodGhpcywgdGhpcy5pbWFnZXMubGVuZ3RoLCB0YWdzKTtcbiAgICAgICAgY29uc3QgbmV4dE9mZnNldCA9IHRoaXMuc291cmNlLmdldFVpbnQocG9zLCB0aGlzLmlmZENvbmZpZy5wb2ludGVyKTtcbiAgICAgICAgcmV0dXJuIHsgbmV4dE9mZnNldCwgaW1hZ2UgfTtcbiAgICB9XG5cbiAgICAvKiogQ2xvc2UgdGhlIGZpbGUgc291cmNlIGlmIGl0IG5lZWRzIGNsb3NpbmcgKi9cbiAgICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2U/LmNsb3NlPy4oKTtcbiAgICB9XG59XG4iXX0=
|
|
155
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nLnRpZmYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29nLnRpZmYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVwRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFdEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBaUIsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzlELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVqRCxNQUFNLE9BQU8sT0FBTztJQVNoQixZQUFZLE1BQW1CO1FBUC9CLFlBQU8sR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDO1FBQzNCLFdBQU0sR0FBbUIsRUFBRSxDQUFDO1FBQzVCLFlBQU8sR0FBRyxJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFHbkMsY0FBUyxHQUFrQixhQUFhLENBQUM7UUFZekMsNkJBQTZCO1FBQzdCLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBVmxCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELHNDQUFzQztJQUN0QyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQW1CO1FBQzdCLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQU1EOzs7O09BSUc7SUFD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QUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDL0IsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDekMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFFaEIsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUk7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDakYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQ3pCO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9ELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVELGdEQUFnRDtJQUNoRCxLQUFLLENBQUMsS0FBSzs7UUFDUCxNQUFNLENBQUEsTUFBQSxNQUFBLElBQUksQ0FBQyxNQUFNLDBDQUFFLEtBQUssa0RBQUksQ0FBQSxDQUFDO0lBQ2pDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENodW5rU291cmNlIH0gZnJvbSAnQGNodW5rZC9jb3JlJztcbmltcG9ydCB7IENvZ1RpZmZJbWFnZSB9IGZyb20gJy4vY29nLnRpZmYuaW1hZ2UuanMnO1xuaW1wb3J0IHsgVGlmZkVuZGlhbiB9IGZyb20gJy4vY29uc3QvdGlmZi5lbmRpYW4uanMnO1xuaW1wb3J0IHsgVGlmZlRhZyB9IGZyb20gJy4vY29uc3QvdGlmZi50YWcuaWQuanMnO1xuaW1wb3J0IHsgVGlmZlZlcnNpb24gfSBmcm9tICcuL2NvbnN0L3RpZmYudmVyc2lvbi5qcyc7XG5pbXBvcnQgeyBDb2dUaWZmVGFnQmFzZSB9IGZyb20gJy4vcmVhZC90YWcvdGlmZi50YWcuYmFzZS5qcyc7XG5pbXBvcnQgeyBDb2dUaWZHaG9zdE9wdGlvbnMgfSBmcm9tICcuL3JlYWQvdGlmZi5nZGFsLmpzJztcbmltcG9ydCB7IFRhZ1RpZmZCaWdDb25maWcsIFRhZ1RpZmZDb25maWcsIFRpZmZJZmRDb25maWcgfSBmcm9tICcuL3JlYWQvdGlmZi5pZmQuY29uZmlnLmpzJztcbmltcG9ydCB7IENvZ1RpZmZUYWcgfSBmcm9tICcuL3JlYWQvdGlmZi50YWcuanMnO1xuaW1wb3J0IHsgQ29nU291cmNlQ3Vyc29yIH0gZnJvbSAnLi9zb3VyY2UvY29nLnNvdXJjZS52aWV3LmpzJztcbmltcG9ydCB7IHRvSGV4U3RyaW5nIH0gZnJvbSAnLi91dGlsL3V0aWwuaGV4LmpzJztcblxuZXhwb3J0IGNsYXNzIENvZ1RpZmYge1xuICAgIHNvdXJjZTogQ2h1bmtTb3VyY2U7XG4gICAgdmVyc2lvbiA9IFRpZmZWZXJzaW9uLlRpZmY7XG4gICAgaW1hZ2VzOiBDb2dUaWZmSW1hZ2VbXSA9IFtdO1xuICAgIG9wdGlvbnMgPSBuZXcgQ29nVGlmR2hvc3RPcHRpb25zKCk7XG5cbiAgICBwcml2YXRlIGN1cnNvcjogQ29nU291cmNlQ3Vyc29yO1xuICAgIGlmZENvbmZpZzogVGlmZklmZENvbmZpZyA9IFRhZ1RpZmZDb25maWc7XG5cbiAgICBjb25zdHJ1Y3Rvcihzb3VyY2U6IENodW5rU291cmNlKSB7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICB0aGlzLmN1cnNvciA9IG5ldyBDb2dTb3VyY2VDdXJzb3IodGhpcyk7XG4gICAgfVxuXG4gICAgLyoqIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIENvZ1RpZmYgKi9cbiAgICBzdGF0aWMgY3JlYXRlKHNvdXJjZTogQ2h1bmtTb3VyY2UpOiBQcm9taXNlPENvZ1RpZmY+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb2dUaWZmKHNvdXJjZSkuaW5pdCgpO1xuICAgIH1cblxuICAgIC8qKiBIYXMgaW5pdCgpIGJlZW4gY2FsbGVkICovXG4gICAgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gICAgX2luaXRQcm9taXNlPzogUHJvbWlzZTxDb2dUaWZmPjtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHRoZSBDT0cgbG9hZGluZyBpbiB0aGUgaGVhZGVyIGFuZCBhbGwgaW1hZ2UgaGVhZGVyc1xuICAgICAqXG4gICAgICogQHBhcmFtIGxvYWRHZW9LZXlzIFdoZXRoZXIgdG8gYWxzbyBpbml0aWFsaXplIHRoZSBHZW9LZXlEaXJlY3RvcnlcbiAgICAgKi9cbiAgICBpbml0KGxvYWRHZW9LZXlzID0gZmFsc2UpOiBQcm9taXNlPENvZ1RpZmY+IHtcbiAgICAgICAgaWYgKHRoaXMuX2luaXRQcm9taXNlKSByZXR1cm4gdGhpcy5faW5pdFByb21pc2U7XG4gICAgICAgIHRoaXMuX2luaXRQcm9taXNlID0gdGhpcy5kb0luaXQobG9hZEdlb0tleXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5faW5pdFByb21pc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBkb0luaXQobG9hZEdlb0tleXMgPSBmYWxzZSk6IFByb21pc2U8Q29nVGlmZj4ge1xuICAgICAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKSByZXR1cm4gdGhpcztcbiAgICAgICAgLy8gTG9hZCB0aGUgZmlyc3QgZmV3IEtCIGluLCBtb3JlIGxvYWRzIHdpbGwgcnVuIGFzIG1vcmUgZGF0YSBpcyByZXF1aXJlZFxuICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZS5sb2FkQnl0ZXMoMCwgdGhpcy5zb3VyY2UuY2h1bmtTaXplKTtcbiAgICAgICAgYXdhaXQgdGhpcy5mZXRjaElmZCgpO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLmltYWdlcy5tYXAoKGMpID0+IGMuaW5pdChsb2FkR2VvS2V5cykpKTtcblxuICAgICAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGZldGNoSWZkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy5jdXJzb3Iuc2Vla1RvKDApO1xuICAgICAgICBjb25zdCBlbmRpYW4gPSB2aWV3LnVpbnQxNigpO1xuICAgICAgICB0aGlzLnNvdXJjZS5pc0xpdHRsZUVuZGlhbiA9IGVuZGlhbiA9PT0gVGlmZkVuZGlhbi5MaXR0bGU7XG4gICAgICAgIGlmICghdGhpcy5zb3VyY2UuaXNMaXR0bGVFbmRpYW4pIHRocm93IG5ldyBFcnJvcignT25seSBsaXR0bGUgZW5kaWFuIGlzIHN1cHBvcnRlZCcpO1xuICAgICAgICB0aGlzLnZlcnNpb24gPSB2aWV3LnVpbnQxNigpO1xuXG4gICAgICAgIGxldCBuZXh0T2Zmc2V0SWZkOiBudW1iZXI7XG4gICAgICAgIGlmICh0aGlzLnZlcnNpb24gPT09IFRpZmZWZXJzaW9uLkJpZ1RpZmYpIHtcbiAgICAgICAgICAgIHRoaXMuaWZkQ29uZmlnID0gVGFnVGlmZkJpZ0NvbmZpZztcbiAgICAgICAgICAgIGNvbnN0IHBvaW50ZXJTaXplID0gdmlldy51aW50MTYoKTtcbiAgICAgICAgICAgIGlmIChwb2ludGVyU2l6ZSAhPT0gOCkgdGhyb3cgbmV3IEVycm9yKCdPbmx5IDhieXRlIHBvaW50ZXJzIGFyZSBzdXBwb3J0ZWQnKTtcbiAgICAgICAgICAgIGNvbnN0IHplcm9zID0gdmlldy51aW50MTYoKTtcbiAgICAgICAgICAgIGlmICh6ZXJvcyAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJpZyB0aWZmIGhlYWRlcicpO1xuICAgICAgICAgICAgbmV4dE9mZnNldElmZCA9IHZpZXcucG9pbnRlcigpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudmVyc2lvbiA9PT0gVGlmZlZlcnNpb24uVGlmZikge1xuICAgICAgICAgICAgbmV4dE9mZnNldElmZCA9IHZpZXcucG9pbnRlcigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPbmx5IHRpZmYgc3VwcG9ydGVkIHZlcnNpb246JHt0aGlzLnZlcnNpb259YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBnaG9zdFNpemUgPSBuZXh0T2Zmc2V0SWZkIC0gdGhpcy5jdXJzb3IuY3VycmVudE9mZnNldDtcbiAgICAgICAgLy8gR0RBTCBub3cgc3RvcmVzIG1ldGFkYXRhIGJldHdlZW4gdGhlIElGRCBpbnNpZGUgYSBnaG9zdCBzdG9yYWdlIGFyZWFcbiAgICAgICAgaWYgKGdob3N0U2l6ZSA+IDAgJiYgZ2hvc3RTaXplIDwgMTYgKiAxMDI0KSB7XG4gICAgICAgICAgICAvLyBsb2dnZXI/LmRlYnVnKFxuICAgICAgICAgICAgLy8gICAgIHsgb2Zmc2V0OiB0b0hleFN0cmluZyh0aGlzLmN1cnNvci5jdXJyZW50T2Zmc2V0KSwgbGVuZ3RoOiB0b0hleFN0cmluZyhnaG9zdFNpemUpIH0sXG4gICAgICAgICAgICAvLyAgICAgJ0dob3N0T3B0aW9ucycsXG4gICAgICAgICAgICAvLyApO1xuICAgICAgICAgICAgLy8gdGhpcy5vcHRpb25zLnByb2Nlc3ModGhpcy5zb3VyY2UsIHZpZXcuY3VycmVudE9mZnNldCwgZ2hvc3RTaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NJZmQobmV4dE9mZnNldElmZCk7XG4gICAgfVxuXG4gICAgZ2V0SW1hZ2UoejogbnVtYmVyKTogQ29nVGlmZkltYWdlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VzW3pdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmQgYSBpbWFnZSB3aGljaCBoYXMgYSByZXNvbHV0aW9uIHNpbWlsYXIgdG8gdGhlIHByb3ZpZGVkIHJlc29sdXRpb25cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXNvbHV0aW9uIHJlc29sdXRpb24gdG8gZmluZFxuICAgICAqL1xuICAgIGdldEltYWdlQnlSZXNvbHV0aW9uKHJlc29sdXRpb246IG51bWJlcik6IENvZ1RpZmZJbWFnZSB7XG4gICAgICAgIGNvbnN0IGZpcnN0SW1hZ2UgPSB0aGlzLmltYWdlc1swXTtcbiAgICAgICAgY29uc3QgZmlyc3RJbWFnZVNpemUgPSBmaXJzdEltYWdlLnNpemU7XG4gICAgICAgIGNvbnN0IFtyZWZYXSA9IGZpcnN0SW1hZ2UucmVzb2x1dGlvbjtcblxuICAgICAgICBjb25zdCByZXNvbHV0aW9uQmFzZVggPSByZWZYICogZmlyc3RJbWFnZVNpemUud2lkdGg7XG4gICAgICAgIC8vIGNvbnN0IHJlc29sdXRpb25CYXNlWSA9IHJlZlkgKiBmaXJzdEltYWdlU2l6ZS5oZWlnaHQ7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmltYWdlcy5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgICAgICAgICBjb25zdCBpbWcgPSB0aGlzLmltYWdlc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGltZ1NpemUgPSBpbWcuc2l6ZTtcblxuICAgICAgICAgICAgY29uc3QgaW1nUmVzb2x1dGlvblggPSByZXNvbHV0aW9uQmFzZVggLyBpbWdTaXplLndpZHRoO1xuICAgICAgICAgICAgLy8gVE9ETyBkbyB3ZSBjYXJlIGFib3V0IHkgcmVzb2x1dGlvblxuICAgICAgICAgICAgLy8gY29uc3QgaW1nUmVzb2x1dGlvblkgPSByZXNvbHV0aW9uQmFzZVkgLyBpbWdTaXplLmhlaWdodDtcblxuICAgICAgICAgICAgaWYgKGltZ1Jlc29sdXRpb25YIC0gcmVzb2x1dGlvbiA8PSAwLjAxKSByZXR1cm4gaW1nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaXJzdEltYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcmF3IGJ5dGVzIGZvciBhIHRpbGUgYXQgYSBnaXZlbiB4LHksIGluZGV4LlxuICAgICAqXG4gICAgICogVGhpcyBtYXkgcmV0dXJuIG51bGwgaWYgdGhlIHRpbGUgZG9lcyBub3QgZXhpc3QgZWcgU3BhcnNlIGNvZ3MsXG4gICAgICpcbiAgICAgKiBAcGFyYW0geCB0aWxlIHggaW5kZXhcbiAgICAgKiBAcGFyYW0geSB0aWxlIHkgaW5kZXhcbiAgICAgKiBAcGFyYW0gaW5kZXggaW1hZ2UgaW5kZXhcbiAgICAgKi9cbiAgICBhc3luYyBnZXRUaWxlKHg6IG51bWJlciwgeTogbnVtYmVyLCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTx7IG1pbWVUeXBlOiBzdHJpbmc7IGJ5dGVzOiBVaW50OEFycmF5IH0gfCBudWxsPiB7XG4gICAgICAgIGNvbnN0IGltYWdlID0gdGhpcy5nZXRJbWFnZShpbmRleCk7XG4gICAgICAgIGlmIChpbWFnZSA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgejogJHtpbmRleH1gKTtcbiAgICAgICAgaWYgKCFpbWFnZS5pc1RpbGVkKCkpIHRocm93IG5ldyBFcnJvcignVGlmIGlzIG5vdCB0aWxlZCcpO1xuXG4gICAgICAgIHJldHVybiBpbWFnZS5nZXRUaWxlKHgsIHkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcHJvY2Vzc0lmZChvZmZzZXQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuc291cmNlLmhhc0J5dGVzKG9mZnNldCwgNDA5NikpIGF3YWl0IHRoaXMuc291cmNlLmxvYWRCeXRlcyhvZmZzZXQsIDQwOTYpO1xuXG4gICAgICAgIGNvbnN0IHsgaW1hZ2UsIG5leHRPZmZzZXQgfSA9IGF3YWl0IHRoaXMucmVhZElmZChvZmZzZXQpO1xuICAgICAgICB0aGlzLmltYWdlcy5wdXNoKGltYWdlKTtcblxuICAgICAgICBpZiAobmV4dE9mZnNldCkgYXdhaXQgdGhpcy5wcm9jZXNzSWZkKG5leHRPZmZzZXQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVhZElmZChvZmZzZXQ6IG51bWJlcik6IFByb21pc2U8eyBuZXh0T2Zmc2V0OiBudW1iZXI7IGltYWdlOiBDb2dUaWZmSW1hZ2UgfT4ge1xuICAgICAgICBpZiAoIXRoaXMuc291cmNlLmhhc0J5dGVzKG9mZnNldCwgMTAyNCkpIGF3YWl0IHRoaXMuc291cmNlLmxvYWRCeXRlcyhvZmZzZXQsIHRoaXMuc291cmNlLmNodW5rU2l6ZSk7XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLmN1cnNvci5zZWVrVG8ob2Zmc2V0KTtcbiAgICAgICAgY29uc3QgdGFnQ291bnQgPSB2aWV3Lm9mZnNldCgpO1xuICAgICAgICBjb25zdCBieXRlU3RhcnQgPSBvZmZzZXQgKyB0aGlzLmlmZENvbmZpZy5vZmZzZXQ7XG4gICAgICAgIGNvbnN0IHRhZ3M6IE1hcDxUaWZmVGFnLCBDb2dUaWZmVGFnQmFzZT4gPSBuZXcgTWFwKCk7XG5cbiAgICAgICAgbGV0IHBvcyA9IGJ5dGVTdGFydDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWdDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSBDb2dUaWZmVGFnLmNyZWF0ZSh0aGlzLCBwb3MpO1xuICAgICAgICAgICAgcG9zICs9IHRhZy5zaXplO1xuXG4gICAgICAgICAgICBpZiAodGFnLm5hbWUgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIElGRCBUYWc6ICcgKyB0b0hleFN0cmluZyh0YWcuaWQpKTtcbiAgICAgICAgICAgIHRhZ3Muc2V0KHRhZy5pZCwgdGFnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGltYWdlID0gbmV3IENvZ1RpZmZJbWFnZSh0aGlzLCB0aGlzLmltYWdlcy5sZW5ndGgsIHRhZ3MpO1xuICAgICAgICBjb25zdCBuZXh0T2Zmc2V0ID0gdGhpcy5zb3VyY2UuZ2V0VWludChwb3MsIHRoaXMuaWZkQ29uZmlnLnBvaW50ZXIpO1xuICAgICAgICByZXR1cm4geyBuZXh0T2Zmc2V0LCBpbWFnZSB9O1xuICAgIH1cblxuICAgIC8qKiBDbG9zZSB0aGUgZmlsZSBzb3VyY2UgaWYgaXQgbmVlZHMgY2xvc2luZyAqL1xuICAgIGFzeW5jIGNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZT8uY2xvc2U/LigpO1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -20,4 +20,4 @@ o.spec('TiffTag', () => {
|
|
|
20
20
|
o(lazy.value).deepEquals(res);
|
|
21
21
|
});
|
|
22
22
|
});
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcmVhZC90YWcvX190ZXN0X18vdGFnLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDdkYsT0FBTyxDQUFDLE1BQU0sT0FBTyxDQUFDO0FBQ3RCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDcEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVyRCxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7SUFDbkIsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0MsTUFBTSxhQUFhLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxzQ0FBc0MsQ0FBQyxDQUFDLENBQUM7SUFFMUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDYixhQUFhLENBQUMsTUFBZ0MsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM1RCxDQUFDLENBQUMsQ0FBQztJQUVILENBQUMsQ0FBQyx1QkFBdUIsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNsQyxNQUFNLElBQUksR0FBRyxJQUFJLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUV4QyxNQUFNLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sSUFBSSxHQUFHLElBQUksY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakQsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFM0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDL0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEMsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRlc3RGaWxlQ2h1bmtTb3VyY2UgfSBmcm9tICdAY2h1bmtkL2NvcmUvYnVpbGQvX190ZXN0X18vY2h1bmsuc291cmNlLmZha2UuanMnO1xuaW1wb3J0IG8gZnJvbSAnb3NwZWMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICd1cmwnO1xuaW1wb3J0IHsgQ29nVGlmZiB9IGZyb20gJy4uLy4uLy4uL2NvZy50aWZmLmpzJztcbmltcG9ydCB7IENvZ1RpZmZUYWdMYXp5IH0gZnJvbSAnLi4vdGlmZi50YWcubGF6eS5qcyc7XG5cbm8uc3BlYygnVGlmZlRhZycsICgpID0+IHtcbiAgICBjb25zdCBkaXJOYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuICAgIGNvbnN0IGNvZ1NvdXJjZUZpbGUgPSBuZXcgVGVzdEZpbGVDaHVua1NvdXJjZShwYXRoLmpvaW4oZGlyTmFtZSwgJy4uLy4uLy4uLy4uLy4uL2RhdGEvcmdiYThfdGlsZWQudGlmZicpKTtcblxuICAgIG8uYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIChjb2dTb3VyY2VGaWxlLmNodW5rcyBhcyBNYXA8dW5rbm93biwgdW5rbm93bj4pLmNsZWFyKCk7XG4gICAgfSk7XG5cbiAgICBvKCdzaG91bGQgbG9hZCBsYXp5IHRhZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRpZmYgPSBuZXcgQ29nVGlmZihjb2dTb3VyY2VGaWxlKTtcblxuICAgICAgICBhd2FpdCBjb2dTb3VyY2VGaWxlLmxvYWRCeXRlcygzNjgwLCA4KTtcbiAgICAgICAgY29uc3QgbGF6eSA9IG5ldyBDb2dUaWZmVGFnTGF6eSgzMzksIHRpZmYsIDM2ODApO1xuICAgICAgICBvKGxhenkudmFsdWUpLmVxdWFscyhudWxsKTtcblxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBsYXp5LmZldGNoKCk7XG4gICAgICAgIG8ocmVzKS5kZWVwRXF1YWxzKFsxODc2MSwgNDMsIDgsIDBdKTtcbiAgICAgICAgbyhsYXp5LnZhbHVlKS5kZWVwRXF1YWxzKHJlcyk7XG4gICAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { LogType } from '@chunkd/core';
|
|
2
1
|
import { CogTiffTagBase } from './tiff.tag.base.js';
|
|
3
2
|
export declare class CogTiffTagLazy<T> extends CogTiffTagBase<T> {
|
|
4
3
|
value: T | null;
|
|
5
4
|
get isReady(): boolean;
|
|
6
|
-
fetch(
|
|
5
|
+
fetch(): Promise<T>;
|
|
7
6
|
}
|
|
8
7
|
//# sourceMappingURL=tiff.tag.lazy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tiff.tag.lazy.d.ts","sourceRoot":"","sources":["../../../src/read/tag/tiff.tag.lazy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"tiff.tag.lazy.d.ts","sourceRoot":"","sources":["../../../src/read/tag/tiff.tag.lazy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,qBAAa,cAAc,CAAC,CAAC,CAAE,SAAQ,cAAc,CAAC,CAAC,CAAC;IACpD,KAAK,EAAE,CAAC,GAAG,IAAI,CAAQ;IAEvB,IAAI,OAAO,IAAI,OAAO,CAErB;IAEK,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC;CAO5B"}
|
|
@@ -7,12 +7,12 @@ export class CogTiffTagLazy extends CogTiffTagBase {
|
|
|
7
7
|
get isReady() {
|
|
8
8
|
return this.value != null;
|
|
9
9
|
}
|
|
10
|
-
async fetch(
|
|
10
|
+
async fetch() {
|
|
11
11
|
if (this.tiff.source.hasBytes(this.valuePointer, this.dataLength) === false) {
|
|
12
|
-
await this.tiff.source.loadBytes(this.valuePointer, this.dataLength
|
|
12
|
+
await this.tiff.source.loadBytes(this.valuePointer, this.dataLength);
|
|
13
13
|
}
|
|
14
14
|
this.value = this.readValue();
|
|
15
15
|
return this.value;
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlmZi50YWcubGF6eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZWFkL3RhZy90aWZmLnRhZy5sYXp5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVwRCxNQUFNLE9BQU8sY0FBa0IsU0FBUSxjQUFpQjtJQUF4RDs7UUFDSSxVQUFLLEdBQWEsSUFBSSxDQUFDO0lBYTNCLENBQUM7SUFYRyxJQUFJLE9BQU87UUFDUCxPQUFPLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDO0lBQzlCLENBQUM7SUFFRCxLQUFLLENBQUMsS0FBSztRQUNQLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEtBQUssRUFBRTtZQUN6RSxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUN4RTtRQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzlCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUN0QixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb2dUaWZmVGFnQmFzZSB9IGZyb20gJy4vdGlmZi50YWcuYmFzZS5qcyc7XG5cbmV4cG9ydCBjbGFzcyBDb2dUaWZmVGFnTGF6eTxUPiBleHRlbmRzIENvZ1RpZmZUYWdCYXNlPFQ+IHtcbiAgICB2YWx1ZTogVCB8IG51bGwgPSBudWxsO1xuXG4gICAgZ2V0IGlzUmVhZHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlICE9IG51bGw7XG4gICAgfVxuXG4gICAgYXN5bmMgZmV0Y2goKTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGlmICh0aGlzLnRpZmYuc291cmNlLmhhc0J5dGVzKHRoaXMudmFsdWVQb2ludGVyLCB0aGlzLmRhdGFMZW5ndGgpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy50aWZmLnNvdXJjZS5sb2FkQnl0ZXModGhpcy52YWx1ZVBvaW50ZXIsIHRoaXMuZGF0YUxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMucmVhZFZhbHVlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { LogType } from '@chunkd/core';
|
|
2
1
|
import { CogTiff } from '../../cog.tiff.js';
|
|
3
2
|
import { CogTiffTagBase } from './tiff.tag.base.js';
|
|
4
3
|
/**
|
|
@@ -11,12 +10,12 @@ export declare class CogTiffTagOffset extends CogTiffTagBase<number[]> {
|
|
|
11
10
|
constructor(tagId: number, tiff: CogTiff, offset: number);
|
|
12
11
|
get value(): number[] | null;
|
|
13
12
|
/** Load the entire index into memory */
|
|
14
|
-
load(
|
|
13
|
+
load(): Promise<void>;
|
|
15
14
|
readValue(): number[];
|
|
16
15
|
/**
|
|
17
16
|
* Read a specific value from the offset array
|
|
18
17
|
* @param index index to read at
|
|
19
18
|
*/
|
|
20
|
-
getValueAt(index: number
|
|
19
|
+
getValueAt(index: number): Promise<number>;
|
|
21
20
|
}
|
|
22
21
|
//# sourceMappingURL=tiff.tag.offset.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tiff.tag.offset.d.ts","sourceRoot":"","sources":["../../../src/read/tag/tiff.tag.offset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"tiff.tag.offset.d.ts","sourceRoot":"","sources":["../../../src/read/tag/tiff.tag.offset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD;;;;GAIG;AACH,qBAAa,gBAAiB,SAAQ,cAAc,CAAC,MAAM,EAAE,CAAC;IAC1D,OAAO,CAAC,YAAY,CAAyB;gBAEjC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM;IAIxD,IAAI,KAAK,IAAI,MAAM,EAAE,GAAG,IAAI,CAS3B;IAED,wCAAwC;IAClC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,SAAS,IAAI,MAAM,EAAE;IAWrB;;;OAGG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAYnD"}
|
|
@@ -20,8 +20,8 @@ export class CogTiffTagOffset extends CogTiffTagBase {
|
|
|
20
20
|
return null;
|
|
21
21
|
}
|
|
22
22
|
/** Load the entire index into memory */
|
|
23
|
-
async load(
|
|
24
|
-
await this.tiff.source.loadBytes(this.valuePointer, this.dataLength
|
|
23
|
+
async load() {
|
|
24
|
+
await this.tiff.source.loadBytes(this.valuePointer, this.dataLength);
|
|
25
25
|
this.readValue();
|
|
26
26
|
}
|
|
27
27
|
readValue() {
|
|
@@ -39,16 +39,16 @@ export class CogTiffTagOffset extends CogTiffTagBase {
|
|
|
39
39
|
* Read a specific value from the offset array
|
|
40
40
|
* @param index index to read at
|
|
41
41
|
*/
|
|
42
|
-
async getValueAt(index
|
|
42
|
+
async getValueAt(index) {
|
|
43
43
|
if (this.loadedValues)
|
|
44
44
|
return this.loadedValues[index];
|
|
45
45
|
const dataSize = this.dataTypeSize;
|
|
46
46
|
const valueOffset = this.valuePointer + dataSize * index;
|
|
47
47
|
const convert = getTiffTagValueReader(this.dataType);
|
|
48
48
|
if (!this.tiff.source.hasBytes(valueOffset, dataSize)) {
|
|
49
|
-
await this.tiff.source.loadBytes(valueOffset, dataSize
|
|
49
|
+
await this.tiff.source.loadBytes(valueOffset, dataSize);
|
|
50
50
|
}
|
|
51
51
|
return convert(this.tiff.source, valueOffset);
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlmZi50YWcub2Zmc2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JlYWQvdGFnL3RpZmYudGFnLm9mZnNldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFcEQ7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxjQUF3QjtJQUcxRCxZQUFZLEtBQWEsRUFBRSxJQUFhLEVBQUUsTUFBYztRQUNwRCxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUh2QixpQkFBWSxHQUFvQixJQUFJLENBQUM7SUFJN0MsQ0FBQztJQUVELElBQUksS0FBSztRQUNMLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBRXhELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNmLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNqQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7U0FDNUI7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsd0NBQXdDO0lBQ3hDLEtBQUssQ0FBQyxJQUFJO1FBQ04sTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxTQUFTO1FBQ0wsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzlCLG1FQUFtRTtRQUNuRSxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRTtZQUN6QixJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDN0I7YUFBTTtZQUNILElBQUksQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDO1NBQzNCO1FBQ0QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQWE7UUFDMUIsSUFBSSxJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV2RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ25DLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN6RCxNQUFNLE9BQU8sR0FBRyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFckQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLEVBQUU7WUFDbkQsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQzNEO1FBQ0QsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFXLENBQUM7SUFDNUQsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29nVGlmZiB9IGZyb20gJy4uLy4uL2NvZy50aWZmLmpzJztcbmltcG9ydCB7IGdldFRpZmZUYWdWYWx1ZVJlYWRlciB9IGZyb20gJy4uL3RpZmYudmFsdWUucmVhZGVyLmpzJztcbmltcG9ydCB7IENvZ1RpZmZUYWdCYXNlIH0gZnJvbSAnLi90aWZmLnRhZy5iYXNlLmpzJztcblxuLyoqXG4gKiBUaWZmVGFnIGZvciBvZmZzZXQgYXJyYXlzXG4gKlxuICogQWxsb3dzIGluZGl2aWR1YWwgYWNjZXNzIHRvIHNwZWNpZmljIHJlY29yZHMgd2l0aG91dCBoYXZpbmcgdG8gcmVhZCB0aGUgZW50aXJlIHRhZyBpbi5cbiAqL1xuZXhwb3J0IGNsYXNzIENvZ1RpZmZUYWdPZmZzZXQgZXh0ZW5kcyBDb2dUaWZmVGFnQmFzZTxudW1iZXJbXT4ge1xuICAgIHByaXZhdGUgbG9hZGVkVmFsdWVzOiBudW1iZXJbXSB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IodGFnSWQ6IG51bWJlciwgdGlmZjogQ29nVGlmZiwgb2Zmc2V0OiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIodGFnSWQsIHRpZmYsIG9mZnNldCk7XG4gICAgfVxuXG4gICAgZ2V0IHZhbHVlKCk6IG51bWJlcltdIHwgbnVsbCB7XG4gICAgICAgIGlmICh0aGlzLmxvYWRlZFZhbHVlcyAhPSBudWxsKSByZXR1cm4gdGhpcy5sb2FkZWRWYWx1ZXM7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzQnl0ZXMpIHtcbiAgICAgICAgICAgIHRoaXMucmVhZFZhbHVlKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkZWRWYWx1ZXM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKiogTG9hZCB0aGUgZW50aXJlIGluZGV4IGludG8gbWVtb3J5ICovXG4gICAgYXN5bmMgbG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy50aWZmLnNvdXJjZS5sb2FkQnl0ZXModGhpcy52YWx1ZVBvaW50ZXIsIHRoaXMuZGF0YUxlbmd0aCk7XG4gICAgICAgIHRoaXMucmVhZFZhbHVlKCk7XG4gICAgfVxuXG4gICAgcmVhZFZhbHVlKCk6IG51bWJlcltdIHtcbiAgICAgICAgY29uc3QgdmFsID0gc3VwZXIucmVhZFZhbHVlKCk7XG4gICAgICAgIC8vIGlmIG9ubHkgb25lIHZhbHVlIGlzIHJlYWQgaW4sIGl0IHdpbGwgbm90IGJlIHJldHVybmVkIGFzIGEgYXJyYXlcbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRlZFZhbHVlcyA9IFt2YWxdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2FkZWRWYWx1ZXMgPSB2YWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGVkVmFsdWVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBzcGVjaWZpYyB2YWx1ZSBmcm9tIHRoZSBvZmZzZXQgYXJyYXlcbiAgICAgKiBAcGFyYW0gaW5kZXggaW5kZXggdG8gcmVhZCBhdFxuICAgICAqL1xuICAgIGFzeW5jIGdldFZhbHVlQXQoaW5kZXg6IG51bWJlcik6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIGlmICh0aGlzLmxvYWRlZFZhbHVlcykgcmV0dXJuIHRoaXMubG9hZGVkVmFsdWVzW2luZGV4XTtcblxuICAgICAgICBjb25zdCBkYXRhU2l6ZSA9IHRoaXMuZGF0YVR5cGVTaXplO1xuICAgICAgICBjb25zdCB2YWx1ZU9mZnNldCA9IHRoaXMudmFsdWVQb2ludGVyICsgZGF0YVNpemUgKiBpbmRleDtcbiAgICAgICAgY29uc3QgY29udmVydCA9IGdldFRpZmZUYWdWYWx1ZVJlYWRlcih0aGlzLmRhdGFUeXBlKTtcblxuICAgICAgICBpZiAoIXRoaXMudGlmZi5zb3VyY2UuaGFzQnl0ZXModmFsdWVPZmZzZXQsIGRhdGFTaXplKSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy50aWZmLnNvdXJjZS5sb2FkQnl0ZXModmFsdWVPZmZzZXQsIGRhdGFTaXplKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udmVydCh0aGlzLnRpZmYuc291cmNlLCB2YWx1ZU9mZnNldCkgYXMgbnVtYmVyO1xuICAgIH1cbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cogeotiff/core",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "7.0.0",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/blacha/cogeotiff.git",
|
|
@@ -18,16 +18,15 @@
|
|
|
18
18
|
"test": "ospec --globs 'build/**/*.test.js'"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@chunkd/core": "^8.0
|
|
21
|
+
"@chunkd/core": "^8.1.0",
|
|
22
22
|
"ieee754": "^1.1.13"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"@types/node": "^14.14.22",
|
|
26
|
-
"@types/ospec": "^4.0.
|
|
27
|
-
"ospec": "^4.0.0"
|
|
26
|
+
"@types/ospec": "^4.0.3"
|
|
28
27
|
},
|
|
29
28
|
"publishConfig": {
|
|
30
29
|
"access": "public"
|
|
31
30
|
},
|
|
32
|
-
"gitHead": "
|
|
31
|
+
"gitHead": "a2352ec8df0f0eb5f5dddacc0f3cdea855dceda3"
|
|
33
32
|
}
|
package/src/cog.tiff.image.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { LogType } from '@chunkd/core';
|
|
2
1
|
import { CogTiff } from './cog.tiff.js';
|
|
3
2
|
import { TiffCompression, TiffMimeType } from './const/tiff.mime.js';
|
|
4
3
|
import { TiffTag, TiffTagGeo } from './const/tiff.tag.id.js';
|
|
@@ -56,27 +55,27 @@ export class CogTiffImage {
|
|
|
56
55
|
*
|
|
57
56
|
* @param loadGeoTags Whether to load the GeoKeyDirectory and unpack it
|
|
58
57
|
*/
|
|
59
|
-
async init(loadGeoTags = false
|
|
58
|
+
async init(loadGeoTags = false): Promise<void> {
|
|
60
59
|
const requiredTags = [
|
|
61
|
-
this.fetch(TiffTag.Compression
|
|
62
|
-
this.fetch(TiffTag.ImageHeight
|
|
63
|
-
this.fetch(TiffTag.ImageWidth
|
|
64
|
-
this.fetch(TiffTag.ModelPixelScale
|
|
65
|
-
this.fetch(TiffTag.ModelTiePoint
|
|
66
|
-
this.fetch(TiffTag.ModelTransformation
|
|
67
|
-
this.fetch(TiffTag.TileHeight
|
|
68
|
-
this.fetch(TiffTag.TileWidth
|
|
60
|
+
this.fetch(TiffTag.Compression),
|
|
61
|
+
this.fetch(TiffTag.ImageHeight),
|
|
62
|
+
this.fetch(TiffTag.ImageWidth),
|
|
63
|
+
this.fetch(TiffTag.ModelPixelScale),
|
|
64
|
+
this.fetch(TiffTag.ModelTiePoint),
|
|
65
|
+
this.fetch(TiffTag.ModelTransformation),
|
|
66
|
+
this.fetch(TiffTag.TileHeight),
|
|
67
|
+
this.fetch(TiffTag.TileWidth),
|
|
69
68
|
];
|
|
70
69
|
|
|
71
70
|
if (loadGeoTags) {
|
|
72
|
-
requiredTags.push(this.fetch(TiffTag.GeoKeyDirectory
|
|
73
|
-
requiredTags.push(this.fetch(TiffTag.GeoAsciiParams
|
|
74
|
-
requiredTags.push(this.fetch(TiffTag.GeoDoubleParams
|
|
71
|
+
requiredTags.push(this.fetch(TiffTag.GeoKeyDirectory));
|
|
72
|
+
requiredTags.push(this.fetch(TiffTag.GeoAsciiParams));
|
|
73
|
+
requiredTags.push(this.fetch(TiffTag.GeoDoubleParams));
|
|
75
74
|
}
|
|
76
75
|
|
|
77
76
|
await Promise.all(requiredTags);
|
|
78
77
|
if (loadGeoTags) {
|
|
79
|
-
await this.loadGeoTiffTags(
|
|
78
|
+
await this.loadGeoTiffTags();
|
|
80
79
|
}
|
|
81
80
|
}
|
|
82
81
|
|
|
@@ -92,7 +91,7 @@ export class CogTiffImage {
|
|
|
92
91
|
/**
|
|
93
92
|
* Load and unpack the GeoKeyDirectory
|
|
94
93
|
*/
|
|
95
|
-
async loadGeoTiffTags(
|
|
94
|
+
async loadGeoTiffTags(): Promise<void> {
|
|
96
95
|
// Already loaded
|
|
97
96
|
if (this.tagsGeoLoaded) return;
|
|
98
97
|
const sourceTag = this.tags.get(TiffTag.GeoKeyDirectory);
|
|
@@ -103,9 +102,9 @@ export class CogTiffImage {
|
|
|
103
102
|
if (!sourceTag.isReady && sourceTag instanceof CogTiffTagLazy) {
|
|
104
103
|
// Load all the required keys
|
|
105
104
|
await Promise.all([
|
|
106
|
-
this.fetch(TiffTag.GeoKeyDirectory
|
|
107
|
-
this.fetch(TiffTag.GeoAsciiParams
|
|
108
|
-
this.fetch(TiffTag.GeoDoubleParams
|
|
105
|
+
this.fetch(TiffTag.GeoKeyDirectory),
|
|
106
|
+
this.fetch(TiffTag.GeoAsciiParams),
|
|
107
|
+
this.fetch(TiffTag.GeoDoubleParams),
|
|
109
108
|
]);
|
|
110
109
|
}
|
|
111
110
|
this.tagsGeoLoaded = true;
|
|
@@ -145,10 +144,10 @@ export class CogTiffImage {
|
|
|
145
144
|
* Load a tag, if it is not currently loaded, fetch the required data for the tag.
|
|
146
145
|
* @param tag tag to fetch
|
|
147
146
|
*/
|
|
148
|
-
public async fetch<T>(tag: TiffTag
|
|
147
|
+
public async fetch<T>(tag: TiffTag): Promise<T | null> {
|
|
149
148
|
const sourceTag = this.tags.get(tag);
|
|
150
149
|
if (sourceTag == null) return null;
|
|
151
|
-
if (CogTiffTag.isLazy(sourceTag)) return sourceTag.fetch(
|
|
150
|
+
if (CogTiffTag.isLazy(sourceTag)) return sourceTag.fetch() as any;
|
|
152
151
|
return sourceTag.value as T;
|
|
153
152
|
}
|
|
154
153
|
|
|
@@ -342,14 +341,14 @@ export class CogTiffImage {
|
|
|
342
341
|
* @param index tile index
|
|
343
342
|
* @returns file offset of the specified tile
|
|
344
343
|
*/
|
|
345
|
-
protected async getTileOffset(index: number
|
|
344
|
+
protected async getTileOffset(index: number): Promise<number> {
|
|
346
345
|
const tileOffset = this.tileOffset;
|
|
347
346
|
if (index < 0 || index > tileOffset.dataCount) {
|
|
348
347
|
throw new Error(`Tile offset: ${index} out of range: 0 -> ${tileOffset.dataCount}`);
|
|
349
348
|
}
|
|
350
349
|
|
|
351
350
|
// Fetch only the part of the offsets that are needed
|
|
352
|
-
return tileOffset.getValueAt(index
|
|
351
|
+
return tileOffset.getValueAt(index);
|
|
353
352
|
}
|
|
354
353
|
|
|
355
354
|
// Clamp the bounds of the output image to the size of the image, as sometimes the edge tiles are not full tiles
|
|
@@ -398,13 +397,12 @@ export class CogTiffImage {
|
|
|
398
397
|
private async getBytes(
|
|
399
398
|
offset: number,
|
|
400
399
|
byteCount: number,
|
|
401
|
-
l?: LogType,
|
|
402
400
|
): Promise<{ mimeType: TiffMimeType; bytes: Uint8Array } | null> {
|
|
403
401
|
const mimeType = this.compression;
|
|
404
402
|
if (mimeType == null) throw new Error('Unsupported compression: ' + this.value(TiffTag.Compression));
|
|
405
403
|
if (byteCount === 0) return null;
|
|
406
404
|
|
|
407
|
-
await this.tif.source.loadBytes(offset, byteCount
|
|
405
|
+
await this.tif.source.loadBytes(offset, byteCount);
|
|
408
406
|
const bytes = this.tif.source.bytes(offset, byteCount);
|
|
409
407
|
|
|
410
408
|
if (this.compression === TiffMimeType.JPEG) {
|
|
@@ -421,7 +419,7 @@ export class CogTiffImage {
|
|
|
421
419
|
* @param x Tile x offset
|
|
422
420
|
* @param y Tile y offset
|
|
423
421
|
*/
|
|
424
|
-
async getTile(x: number, y: number
|
|
422
|
+
async getTile(x: number, y: number): Promise<{ mimeType: TiffMimeType; bytes: Uint8Array } | null> {
|
|
425
423
|
const mimeType = this.compression;
|
|
426
424
|
const size = this.size;
|
|
427
425
|
const tiles = this.tileSize;
|
|
@@ -441,22 +439,22 @@ export class CogTiffImage {
|
|
|
441
439
|
const totalTiles = nxTiles * nyTiles;
|
|
442
440
|
if (idx >= totalTiles) throw new Error(`Tile index is outside of tile range: ${idx} >= ${totalTiles}`);
|
|
443
441
|
|
|
444
|
-
const { offset, imageSize } = await this.getTileSize(idx
|
|
445
|
-
return this.getBytes(offset, imageSize
|
|
442
|
+
const { offset, imageSize } = await this.getTileSize(idx);
|
|
443
|
+
return this.getBytes(offset, imageSize);
|
|
446
444
|
}
|
|
447
445
|
|
|
448
|
-
protected async getTileSize(index: number
|
|
446
|
+
protected async getTileSize(index: number): Promise<{ offset: number; imageSize: number }> {
|
|
449
447
|
// GDAL optimizes tiles by storing the size of the tile in
|
|
450
448
|
// the few bytes leading up to the tile
|
|
451
449
|
if (this.tif.options.tileLeaderByteSize) {
|
|
452
|
-
const offset = await this.getTileOffset(index
|
|
450
|
+
const offset = await this.getTileOffset(index);
|
|
453
451
|
// Sparse COG no data found
|
|
454
452
|
if (offset === 0) return { offset: 0, imageSize: 0 };
|
|
455
453
|
|
|
456
454
|
const leaderBytes = this.tif.options.tileLeaderByteSize;
|
|
457
455
|
// This fetch will generally load in the bytes needed for the image too
|
|
458
456
|
// provided the image size is less than the size of a chunk
|
|
459
|
-
await this.tif.source.loadBytes(offset - leaderBytes, leaderBytes
|
|
457
|
+
await this.tif.source.loadBytes(offset - leaderBytes, leaderBytes);
|
|
460
458
|
return { offset, imageSize: this.tif.source.getUint(offset - leaderBytes, leaderBytes) };
|
|
461
459
|
}
|
|
462
460
|
|
|
@@ -464,7 +462,7 @@ export class CogTiffImage {
|
|
|
464
462
|
if (byteCounts == null) {
|
|
465
463
|
throw new Error('No tile byte counts found');
|
|
466
464
|
}
|
|
467
|
-
const [offset, imageSize] = await Promise.all([this.getTileOffset(index
|
|
465
|
+
const [offset, imageSize] = await Promise.all([this.getTileOffset(index), byteCounts.getValueAt(index)]);
|
|
468
466
|
return { offset, imageSize };
|
|
469
467
|
}
|
|
470
468
|
}
|
package/src/cog.tiff.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ChunkSource
|
|
1
|
+
import { ChunkSource } from '@chunkd/core';
|
|
2
2
|
import { CogTiffImage } from './cog.tiff.image.js';
|
|
3
3
|
import { TiffEndian } from './const/tiff.endian.js';
|
|
4
4
|
import { TiffTag } from './const/tiff.tag.id.js';
|
|
@@ -38,24 +38,24 @@ export class CogTiff {
|
|
|
38
38
|
*
|
|
39
39
|
* @param loadGeoKeys Whether to also initialize the GeoKeyDirectory
|
|
40
40
|
*/
|
|
41
|
-
init(loadGeoKeys = false
|
|
41
|
+
init(loadGeoKeys = false): Promise<CogTiff> {
|
|
42
42
|
if (this._initPromise) return this._initPromise;
|
|
43
|
-
this._initPromise = this.doInit(loadGeoKeys
|
|
43
|
+
this._initPromise = this.doInit(loadGeoKeys);
|
|
44
44
|
return this._initPromise;
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
private async doInit(loadGeoKeys = false
|
|
47
|
+
private async doInit(loadGeoKeys = false): Promise<CogTiff> {
|
|
48
48
|
if (this.isInitialized) return this;
|
|
49
49
|
// Load the first few KB in, more loads will run as more data is required
|
|
50
|
-
await this.source.loadBytes(0, this.source.chunkSize
|
|
51
|
-
await this.fetchIfd(
|
|
52
|
-
await Promise.all(this.images.map((c) => c.init(loadGeoKeys
|
|
50
|
+
await this.source.loadBytes(0, this.source.chunkSize);
|
|
51
|
+
await this.fetchIfd();
|
|
52
|
+
await Promise.all(this.images.map((c) => c.init(loadGeoKeys)));
|
|
53
53
|
|
|
54
54
|
this.isInitialized = true;
|
|
55
55
|
return this;
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
-
private async fetchIfd(
|
|
58
|
+
private async fetchIfd(): Promise<void> {
|
|
59
59
|
const view = this.cursor.seekTo(0);
|
|
60
60
|
const endian = view.uint16();
|
|
61
61
|
this.source.isLittleEndian = endian === TiffEndian.Little;
|
|
@@ -79,14 +79,14 @@ export class CogTiff {
|
|
|
79
79
|
const ghostSize = nextOffsetIfd - this.cursor.currentOffset;
|
|
80
80
|
// GDAL now stores metadata between the IFD inside a ghost storage area
|
|
81
81
|
if (ghostSize > 0 && ghostSize < 16 * 1024) {
|
|
82
|
-
logger?.debug(
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
);
|
|
82
|
+
// logger?.debug(
|
|
83
|
+
// { offset: toHexString(this.cursor.currentOffset), length: toHexString(ghostSize) },
|
|
84
|
+
// 'GhostOptions',
|
|
85
|
+
// );
|
|
86
86
|
// this.options.process(this.source, view.currentOffset, ghostSize);
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
-
return this.processIfd(nextOffsetIfd
|
|
89
|
+
return this.processIfd(nextOffsetIfd);
|
|
90
90
|
}
|
|
91
91
|
|
|
92
92
|
getImage(z: number): CogTiffImage {
|
|
@@ -135,38 +135,20 @@ export class CogTiff {
|
|
|
135
135
|
return image.getTile(x, y);
|
|
136
136
|
}
|
|
137
137
|
|
|
138
|
-
private async processIfd(offset: number
|
|
139
|
-
|
|
138
|
+
private async processIfd(offset: number): Promise<void> {
|
|
139
|
+
if (!this.source.hasBytes(offset, 4096)) await this.source.loadBytes(offset, 4096);
|
|
140
140
|
|
|
141
|
-
|
|
142
|
-
await this.source.loadBytes(offset, 4096, logger);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
const { image, nextOffset } = await this.readIfd(offset, logger);
|
|
141
|
+
const { image, nextOffset } = await this.readIfd(offset);
|
|
146
142
|
this.images.push(image);
|
|
147
|
-
const size = image.size;
|
|
148
|
-
if (image.isTiled()) {
|
|
149
|
-
const tile = image.tileSize;
|
|
150
|
-
logger?.debug(
|
|
151
|
-
{
|
|
152
|
-
...size,
|
|
153
|
-
tileWidth: tile.width,
|
|
154
|
-
tileHeight: tile.height,
|
|
155
|
-
tileCount: Math.ceil(size.width / tile.width),
|
|
156
|
-
},
|
|
157
|
-
'GotImage',
|
|
158
|
-
);
|
|
159
|
-
}
|
|
160
143
|
|
|
161
|
-
if (nextOffset) await this.processIfd(nextOffset
|
|
144
|
+
if (nextOffset) await this.processIfd(nextOffset);
|
|
162
145
|
}
|
|
163
146
|
|
|
164
|
-
private async readIfd(offset: number
|
|
165
|
-
if (!this.source.hasBytes(offset, 1024)) await this.source.loadBytes(offset, this.source.chunkSize
|
|
147
|
+
private async readIfd(offset: number): Promise<{ nextOffset: number; image: CogTiffImage }> {
|
|
148
|
+
if (!this.source.hasBytes(offset, 1024)) await this.source.loadBytes(offset, this.source.chunkSize);
|
|
166
149
|
const view = this.cursor.seekTo(offset);
|
|
167
150
|
const tagCount = view.offset();
|
|
168
151
|
const byteStart = offset + this.ifdConfig.offset;
|
|
169
|
-
const logger = log?.child({ imageId: this.images.length });
|
|
170
152
|
const tags: Map<TiffTag, CogTiffTagBase> = new Map();
|
|
171
153
|
|
|
172
154
|
let pos = byteStart;
|
|
@@ -174,33 +156,7 @@ export class CogTiff {
|
|
|
174
156
|
const tag = CogTiffTag.create(this, pos);
|
|
175
157
|
pos += tag.size;
|
|
176
158
|
|
|
177
|
-
if (tag.name == null)
|
|
178
|
-
logger?.error({ code: toHexString(tag.id) }, `IFDUnknown`);
|
|
179
|
-
continue;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
if (!tag.isReady) {
|
|
183
|
-
logger?.trace(
|
|
184
|
-
{
|
|
185
|
-
offset: toHexString(pos - offset),
|
|
186
|
-
code: toHexString(tag.id),
|
|
187
|
-
tagName: tag.name,
|
|
188
|
-
ptr: toHexString(tag.valuePointer),
|
|
189
|
-
},
|
|
190
|
-
'PartialReadIFD',
|
|
191
|
-
);
|
|
192
|
-
} else {
|
|
193
|
-
logger?.trace(
|
|
194
|
-
{
|
|
195
|
-
offset: toHexString(pos - offset),
|
|
196
|
-
code: toHexString(tag.id),
|
|
197
|
-
tagName: tag.name,
|
|
198
|
-
value: Array.isArray(tag.value) ? `[${tag.value.length}]` : tag.value,
|
|
199
|
-
},
|
|
200
|
-
'ReadIFD',
|
|
201
|
-
);
|
|
202
|
-
}
|
|
203
|
-
|
|
159
|
+
if (tag.name == null) throw new Error('Unknown IFD Tag: ' + toHexString(tag.id));
|
|
204
160
|
tags.set(tag.id, tag);
|
|
205
161
|
}
|
|
206
162
|
|
|
@@ -10,7 +10,7 @@ o.spec('TiffTag', () => {
|
|
|
10
10
|
const cogSourceFile = new TestFileChunkSource(path.join(dirName, '../../../../../data/rgba8_tiled.tiff'));
|
|
11
11
|
|
|
12
12
|
o.beforeEach(() => {
|
|
13
|
-
cogSourceFile.chunks.clear();
|
|
13
|
+
(cogSourceFile.chunks as Map<unknown, unknown>).clear();
|
|
14
14
|
});
|
|
15
15
|
|
|
16
16
|
o('should load lazy tags', async () => {
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { LogType } from '@chunkd/core';
|
|
2
1
|
import { CogTiffTagBase } from './tiff.tag.base.js';
|
|
3
2
|
|
|
4
3
|
export class CogTiffTagLazy<T> extends CogTiffTagBase<T> {
|
|
@@ -8,9 +7,9 @@ export class CogTiffTagLazy<T> extends CogTiffTagBase<T> {
|
|
|
8
7
|
return this.value != null;
|
|
9
8
|
}
|
|
10
9
|
|
|
11
|
-
async fetch(
|
|
10
|
+
async fetch(): Promise<T> {
|
|
12
11
|
if (this.tiff.source.hasBytes(this.valuePointer, this.dataLength) === false) {
|
|
13
|
-
await this.tiff.source.loadBytes(this.valuePointer, this.dataLength
|
|
12
|
+
await this.tiff.source.loadBytes(this.valuePointer, this.dataLength);
|
|
14
13
|
}
|
|
15
14
|
this.value = this.readValue();
|
|
16
15
|
return this.value;
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { LogType } from '@chunkd/core';
|
|
2
1
|
import { CogTiff } from '../../cog.tiff.js';
|
|
3
2
|
import { getTiffTagValueReader } from '../tiff.value.reader.js';
|
|
4
3
|
import { CogTiffTagBase } from './tiff.tag.base.js';
|
|
@@ -27,8 +26,8 @@ export class CogTiffTagOffset extends CogTiffTagBase<number[]> {
|
|
|
27
26
|
}
|
|
28
27
|
|
|
29
28
|
/** Load the entire index into memory */
|
|
30
|
-
async load(
|
|
31
|
-
await this.tiff.source.loadBytes(this.valuePointer, this.dataLength
|
|
29
|
+
async load(): Promise<void> {
|
|
30
|
+
await this.tiff.source.loadBytes(this.valuePointer, this.dataLength);
|
|
32
31
|
this.readValue();
|
|
33
32
|
}
|
|
34
33
|
|
|
@@ -47,7 +46,7 @@ export class CogTiffTagOffset extends CogTiffTagBase<number[]> {
|
|
|
47
46
|
* Read a specific value from the offset array
|
|
48
47
|
* @param index index to read at
|
|
49
48
|
*/
|
|
50
|
-
async getValueAt(index: number
|
|
49
|
+
async getValueAt(index: number): Promise<number> {
|
|
51
50
|
if (this.loadedValues) return this.loadedValues[index];
|
|
52
51
|
|
|
53
52
|
const dataSize = this.dataTypeSize;
|
|
@@ -55,7 +54,7 @@ export class CogTiffTagOffset extends CogTiffTagBase<number[]> {
|
|
|
55
54
|
const convert = getTiffTagValueReader(this.dataType);
|
|
56
55
|
|
|
57
56
|
if (!this.tiff.source.hasBytes(valueOffset, dataSize)) {
|
|
58
|
-
await this.tiff.source.loadBytes(valueOffset, dataSize
|
|
57
|
+
await this.tiff.source.loadBytes(valueOffset, dataSize);
|
|
59
58
|
}
|
|
60
59
|
return convert(this.tiff.source, valueOffset) as number;
|
|
61
60
|
}
|