@leanix/components 0.2.240 → 0.2.243

Sign up to get free protection for your applications and to get access to all the features.
@@ -13,72 +13,77 @@ import * as i0 from "@angular/core";
13
13
  export class LxLinkifyPipe {
14
14
  transform(text) {
15
15
  if (text && typeof text === 'string') {
16
- let textWithRawLinks = text;
17
- /**
18
- * Keeping track of this index prevents infinite loops
19
- * where a previously processed link starts with the same characters
20
- * as a second link.
21
- * e.g. https://angular.io/docs followed by https://angular.io
22
- */
23
- let nextIndexToStartReplacingFrom = 0;
24
- const rawLinkMatches = this.getAllRegexMatches(LxLinkifyPipe.HTTP_LINK_REGEX, text);
25
- rawLinkMatches.forEach((rawLinkMatch) => {
26
- const [url] = rawLinkMatch;
27
- const wrapUrlInAnchor = (sanitizedUrlMatch) => {
28
- const firstPart = textWithRawLinks.substring(0, nextIndexToStartReplacingFrom);
29
- const anchorTagHtml = `<a href="${sanitizedUrlMatch}" target="_blank" rel="noopener noreferrer">${sanitizedUrlMatch}</a>`;
30
- const secondPart = textWithRawLinks.substring(nextIndexToStartReplacingFrom).replace(sanitizedUrlMatch, anchorTagHtml);
31
- textWithRawLinks = firstPart + secondPart;
32
- nextIndexToStartReplacingFrom = rawLinkMatch.index + anchorTagHtml.length;
33
- };
34
- if (url) {
35
- /*
36
- * TODO: get rid of all this code once Safari supports negative lookbehinds in regular expressions
37
- * The following is RegExp that handles the same stuff as the JS code below:
38
- *
39
- * /(?:(?:(?<!\]\())(?:https|http):\/\/)(?:[^\s/$.?#][^\s]*(?<![\.)]))/gi;
40
- *
41
- * Demo on regex101: https://regex101.com/r/7Vl9bg/1
42
- *
43
- * Check lookbehind support here: https://caniuse.com/?search=lookbehind
44
- */
45
- const lastUrlCharacterIndex = rawLinkMatch.index + url.length - 1;
46
- const textUsedToPerformMatching = rawLinkMatch.input;
47
- const lastCharacterInUrl = textUsedToPerformMatching[lastUrlCharacterIndex];
48
- if (lastCharacterInUrl === '.') {
49
- const characterAfterUrl = textUsedToPerformMatching[lastUrlCharacterIndex + 1];
50
- if (!characterAfterUrl || characterAfterUrl === ' ' || characterAfterUrl === '\n') {
51
- const urlWithoutDotAtTheEnd = url.slice(0, -1);
52
- wrapUrlInAnchor(urlWithoutDotAtTheEnd);
53
- }
54
- }
55
- else if (rawLinkMatch.index > 3) {
56
- const twoCharactersInFrontOfTheLink = `${textUsedToPerformMatching[rawLinkMatch.index - 2]}${textUsedToPerformMatching[rawLinkMatch.index - 1]}`;
57
- if (twoCharactersInFrontOfTheLink && twoCharactersInFrontOfTheLink !== '](') {
58
- // only wrap url in anchor when it is not a named markdown link
59
- wrapUrlInAnchor(url);
60
- }
61
- }
62
- else {
63
- wrapUrlInAnchor(url);
64
- }
65
- }
66
- });
67
- let textWithRawAndNamedLinks = textWithRawLinks;
68
- const namedLinkMatches = this.getAllRegexMatches(LxLinkifyPipe.NAMED_LINK_REGEX, textWithRawLinks);
69
- namedLinkMatches.forEach((namedLinkMatch) => {
70
- const [source, name, url] = namedLinkMatch;
71
- const urlIsValid = url && !/javascript\:/i.test(url);
72
- if (source && name && urlIsValid) {
73
- textWithRawAndNamedLinks = textWithRawAndNamedLinks.replace(source, `<a href="${url}" target="_blank" rel="noopener noreferrer">${name}</a>`);
74
- }
75
- });
16
+ const textWithRawLinks = this.wrapRawHttpLinksWithAnchorTags(text);
17
+ const textWithRawAndNamedLinks = this.turnMarkdownStyleLinksIntoAnchorTags(textWithRawLinks);
76
18
  return textWithRawAndNamedLinks;
77
19
  }
78
20
  else {
79
21
  return text;
80
22
  }
81
23
  }
24
+ turnMarkdownStyleLinksIntoAnchorTags(text) {
25
+ let textWithRawAndNamedLinks = text;
26
+ const namedLinkMatches = this.getAllRegexMatches(LxLinkifyPipe.NAMED_LINK_REGEX, text);
27
+ namedLinkMatches.forEach((namedLinkMatch) => {
28
+ const [source, name, url] = namedLinkMatch;
29
+ const urlIsValid = url && !/javascript\:/i.test(url);
30
+ if (source && name && urlIsValid) {
31
+ textWithRawAndNamedLinks = textWithRawAndNamedLinks.replace(source, `<a href="${url}" target="_blank" rel="noopener noreferrer">${name}</a>`);
32
+ }
33
+ });
34
+ return textWithRawAndNamedLinks;
35
+ }
36
+ wrapRawHttpLinksWithAnchorTags(text) {
37
+ let textWithRawLinks = text;
38
+ /**
39
+ * Keeping track of this index prevents infinite loops
40
+ * where a previously processed link starts with the same characters
41
+ * as a second link.
42
+ * e.g. https://angular.io/docs followed by https://angular.io
43
+ */
44
+ let nextIndexToStartReplacingFrom = 0;
45
+ const rawLinkMatches = this.getAllRegexMatches(LxLinkifyPipe.HTTP_LINK_REGEX, text);
46
+ rawLinkMatches.forEach((rawLinkMatch) => {
47
+ const [url] = rawLinkMatch;
48
+ const wrapUrlInAnchor = (sanitizedUrlMatch) => {
49
+ const firstPart = textWithRawLinks.substring(0, nextIndexToStartReplacingFrom);
50
+ const anchorTagHtml = `<a href="${sanitizedUrlMatch}" target="_blank" rel="noopener noreferrer">${sanitizedUrlMatch}</a>`;
51
+ const secondPart = textWithRawLinks.substring(nextIndexToStartReplacingFrom).replace(sanitizedUrlMatch, anchorTagHtml);
52
+ textWithRawLinks = firstPart + secondPart;
53
+ nextIndexToStartReplacingFrom = rawLinkMatch.index + anchorTagHtml.length;
54
+ };
55
+ if (url) {
56
+ /*
57
+ * TODO: get rid of all this code once Safari supports negative lookbehinds in regular expressions
58
+ * The following is RegExp that handles the same stuff as the JS code below:
59
+ *
60
+ * /(?:(?:(?<!\]\())(?:https|http):\/\/)(?:[^\s/$.?#][^\s]*(?<![\.)]))/gi;
61
+ *
62
+ * Demo on regex101: https://regex101.com/r/7Vl9bg/1
63
+ *
64
+ * Check lookbehind support here: https://caniuse.com/?search=lookbehind
65
+ */
66
+ const lastUrlCharacterIndex = rawLinkMatch.index + url.length - 1;
67
+ const textUsedToPerformMatching = rawLinkMatch.input;
68
+ const lastCharacterInUrl = textUsedToPerformMatching[lastUrlCharacterIndex];
69
+ const twoCharactersInFrontOfTheLink = rawLinkMatch.index > 3
70
+ ? `${textUsedToPerformMatching[rawLinkMatch.index - 2]}${textUsedToPerformMatching[rawLinkMatch.index - 1]}`
71
+ : '';
72
+ const isMarkdownSyntaxLink = twoCharactersInFrontOfTheLink === '](';
73
+ if (!isMarkdownSyntaxLink && lastCharacterInUrl === '.') {
74
+ const characterAfterUrl = textUsedToPerformMatching[lastUrlCharacterIndex + 1];
75
+ if (!characterAfterUrl || characterAfterUrl === ' ' || characterAfterUrl === '\n') {
76
+ const urlWithoutDotAtTheEnd = url.slice(0, -1);
77
+ wrapUrlInAnchor(urlWithoutDotAtTheEnd);
78
+ }
79
+ }
80
+ else if (!isMarkdownSyntaxLink) {
81
+ wrapUrlInAnchor(url);
82
+ }
83
+ }
84
+ });
85
+ return textWithRawLinks;
86
+ }
82
87
  getAllRegexMatches(regex, input) {
83
88
  let match;
84
89
  const matches = [];
@@ -122,4 +127,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImpor
122
127
  type: Pipe,
123
128
  args: [{ name: 'lxLinkify' }]
124
129
  }] });
125
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlua2lmeS5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3NyYy9saWIvY29yZS11aS9waXBlcy9saW5raWZ5L2xpbmtpZnkucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQzs7QUFFcEQ7Ozs7Ozs7OztHQVNHO0FBRUgsTUFBTSxPQUFPLGFBQWE7SUErQnhCLFNBQVMsQ0FBQyxJQUFvQjtRQUM1QixJQUFJLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDcEMsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7WUFDNUI7Ozs7O2VBS0c7WUFDSCxJQUFJLDZCQUE2QixHQUFHLENBQUMsQ0FBQztZQUN0QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwRixjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUU7Z0JBQ3RDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxZQUFZLENBQUM7Z0JBQzNCLE1BQU0sZUFBZSxHQUFHLENBQUMsaUJBQXlCLEVBQUUsRUFBRTtvQkFDcEQsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSw2QkFBNkIsQ0FBQyxDQUFDO29CQUMvRSxNQUFNLGFBQWEsR0FBRyxZQUFZLGlCQUFpQiwrQ0FBK0MsaUJBQWlCLE1BQU0sQ0FBQztvQkFDMUgsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLDZCQUE2QixDQUFDLENBQUMsT0FBTyxDQUFDLGlCQUFrQixFQUFFLGFBQWEsQ0FBQyxDQUFDO29CQUN4SCxnQkFBZ0IsR0FBRyxTQUFTLEdBQUcsVUFBVSxDQUFDO29CQUMxQyw2QkFBNkIsR0FB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RkFBYixhQUFhO2tCQUR6QixJQUFJO21CQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBUaGlzIHBpcGUgdHJhbnNmb3Jtcy4uLlxuICogLSBcInJhd1wiIGh0dHAocykgbGlua3NcbiAqIC0gbWFya2Rvd24gbGluayBzeW50YXhcbiAqIC4uLiBpbnRvIGNsaWNrYWJsZSBhbmNob3IgZWxlbWVudHMuXG4gKlxuICogWW91IGhhdmUgYW4gdXNlciBpbnRlcmZhY2Ugd2hlcmUgeW91IGRvbid0IHdhbnQgY2xpY2thYmxlIGxpbmtzIGJ1dCBhbHNvXG4gKiBkb24ndCB3YW50IHVzZXJzIHRvIHNlZSB0aGUgXCJ1Z2x5XCIgbWFya2Rvd24gbGluayBzeW50YXg/XG4gKiAtPiBVc2UgdGhlICdseFVubGlraWZ5JyBwaXBlIHRvIHJlcGxhY2UgbWFya2Rvd24gbGluayBzeW50YXggd2l0aCBqdXN0IHRoZSBsaW5rIG5hbWVcbiAqL1xuQFBpcGUoeyBuYW1lOiAnbHhMaW5raWZ5JyB9KVxuZXhwb3J0IGNsYXNzIEx4TGlua2lmeVBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgLyoqXG4gICAqIFRoaXMgaXMgbm90IHRoZSBcIm9uZSBVUkwgcmVnZXggdG8gcnVsZSB0aGVtIGFsbFwiLCBidXQgYSBtb3JlIHJlYWxpc3RpYyBvbmUgd2hpY2ggc2hvdWxkIHdvcmtcbiAgICogZm9yIGFueSBVUkxzIHRoYXQgb3VyIGN1c3RvbWVycyBpbmNsdWRlIGluIHRleHQgZmllbGRzIG9uIGEgRmFjdCBTaGVldC5cbiAgICpcbiAgICogUmVnZXggcnVsZXMgZXhwbGFpbmVkIGluIHBsYWluIHRleHQ6XG4gICAqXG4gICAqICg/Oig/Omh0dHBzPyk6XFwvXFwvKSAgICAgICAtPiAgICBMaW5rcyBtdXN0IHN0YXJ0IHdpdGggXCJodHRwczovL1wiIG9yIFwiaHR0cDovL1wiXG4gICAqXG4gICAqICg/OlteXFxzLyQuPyNdW15cXHNdKig/PCFbXFwuKV0pKSBMRVQnUyBTUExJVCBUSElTIE9ORSBVUFxuICAgKlxuICAgKiBbXlxccy8kLj8jXVteXFxzXSogICAtPiAgICBNYXRjaCBhbnkgbGVnYWwgVVJMIGNoYXJhY3RlciB1bnRpbCB0aGUgbmV4dCB3aGl0ZXNwYWNlXG4gICAqICg/PCFbXFwuKV0gICAgICAgICAgLT4gICAgQSBuZWdhdGl2ZSBsb29rYWhlYWQgdG8gcHJldmVudCBtYXRjaGluZyBhIGRvdCBvciBwYXJlbnRoZXNpcyBmb2xsb3dpbmcgYSBVUkxcbiAgICpcbiAgICogTGluayB0byByZWdleDEwMTogaHR0cHM6Ly9yZWdleDEwMS5jb20vci9kM0t0ZkgvMSAoTk9URTogcGxlYXNlIHVwZGF0ZSB0aGlzIGxpbmsgd2hlbiBjaGFuZ2luZyB0aGUgcmVnZXgpXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEhUVFBfTElOS19SRUdFWCA9IC8oPzooPzpodHRwcz8pOlxcL1xcLykoPzpbXlxccy8kLj8jXVteXFxzXSopL2dpO1xuXG4gIC8qKlxuICAgKiBUaGlzIHdpbGwgbWF0Y2ggdGhlIG1hcmtkb3duIGxpbmsgc3ludGF4OiBbbGluayBuYW1lXSh1cmwpXG4gICAqIFJlZ2V4IHJ1bGVzIGV4cGxhaW5lZCBpbiBwbGFpbiB0ZXh0OlxuICAgKlxuICAgKiAoPzpcXFsoW15cXF1dKilcXF0pICAgICAgICAgICAgLT4gICAgIE1hdGNoIGFueSBjaGFyYWN0ZXJzIGluc2lkZSBzcXVhcmUgYnJhY2tldHNcbiAgICogXFwoKFteXFxzXFwvJC4/I11bXlxcc10qKVxcKSAgICAgLT4gICAgIE5vdGljZSB0aGF0IHRoaXMgaXMgdGhlIHNhbWUgcmVnZXggYXMgdGhlIEhUVFBfTElOS19SRUdFWCBhYm92ZSxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgd2l0aG91dCB0aGUgcmVxdWlyZW1lbnQgZm9yIHRoZSBodHRwIHByb3RvY29sLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgYWxsb3dzIGZvciBsaW5rcyB3aXRob3V0IGluY2x1ZGluZyB0aGUgcHJvdG9jb2wgb3IgYWxzbyBcIm1haWx0bzpoZWxsb0B3b3JsZC5kZVwiIGxpbmtzXG4gICAqXG4gICAqIExpbmsgdG8gcmVnZXgxMDE6IGh0dHBzOi8vcmVnZXgxMDEuY29tL3IvNVVNVUg4LzFcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTkFNRURfTElOS19SRUdFWCA9IC8oPzpcXFsoW15cXF1dKilcXF0pXFwoKFteXFxzXFwvJC4/I11bXlxcc10qKVxcKS9naTtcblxuICB0cmFuc2Zvcm0odGV4dD86IHN0cmluZyB8IG51bGwpOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsIHtcbiAgICBpZiAodGV4dCAmJiB0eXBlb2YgdGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGxldCB0ZXh0V2l0aFJhd0xpbmtzID0gdGV4dDtcbiAgICAgIC8qKlxuICAgICAgICogS2VlcGluZyB0cmFjayBvZiB0aGlzIGluZGV4IHByZXZlbnRzIGluZmluaXRlIGxvb3BzXG4gICAgICAgKiB3aGVyZSBhIHByZXZpb3VzbHkgcHJvY2Vzc2VkIGxpbmsgc3RhcnRzIHdpdGggdGhlIHNhbWUgY2hhcmFjdGVyc1xuICAgICAgICogYXMgYSBzZWNvbmQgbGluay5cbiAgICAgICAqIGUuZy4gaHR0cHM6Ly9hbmd1bGFyLmlvL2RvY3MgZm9sbG93ZWQgYnkgaHR0cHM6Ly9hbmd1bGFyLmlvXG4gICAgICAgKi9cbiAgICAgIGxldCBuZXh0SW5kZXhUb1N0YXJ0UmVwbGFjaW5nRnJvbSA9IDA7XG4gICAgICBjb25zdCByYXdMaW5rTWF0Y2hlcyA9IHRoaXMuZ2V0QWxsUmVnZXhNYXRjaGVzKEx4TGlua2lmeVBpcGUuSFRUUF9MSU5LX1JFR0VYLCB0ZXh0KTtcbiAgICAgIHJhd0xpbmtNYXRjaGVzLmZvckVhY2goKHJhd0xpbmtNYXRjaCkgPT4ge1xuICAgICAgICBjb25zdCBbdXJsXSA9IHJhd0xpbmtNYXRjaDtcbiAgICAgICAgY29uc3Qgd3JhcFVybEluQW5jaG9yID0gKHNhbml0aXplZFVybE1hdGNoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBjb25zdCBmaXJzdFBhcnQgPSB0ZXh0V2l0aFJhd0xpbmtzLnN1YnN0cmluZygwLCBuZXh0SW5kZXhUb1N0YXJ0UmVwbGFjaW5nRnJvbSk7XG4gICAgICAgICAgY29uc3QgYW5jaG9yVGFnSHRtbCA9IGA8YSBocmVmPVwiJHtzYW5pdGl6ZWRVcmxNYXRjaH1cIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+JHtzYW5pdGl6ZWRVcmxNYXRjaH08L2E+YDtcbiAgICAgICAgICBjb25zdCBzZWNvbmRQYXJ0ID0gdGV4dFdpdGhSYXdMaW5rcy5zdWJzdHJpbmcobmV4dEluZGV4VG9TdGFydFJlcGxhY2luZ0Zyb20pLnJlcGxhY2Uoc2FuaXRpemVkVXJsTWF0Y2ghLCBhbmNob3JUYWdIdG1sKTtcbiAgICAgICAgICB0ZXh0V2l0aFJhd0xpbmtzID0gZmlyc3RQYXJ0ICsgc2Vjb25kUGFydDtcbiAgICAgICAgICBuZXh0SW5kZXhUb1N0YXJ0UmVwbGFjaW5nRnJvbSA9IHJhd0xpbmtNYXRjaC5pbmRleCArIGFuY2hvclRhZ0h0bWwubGVuZ3RoO1xuICAgICAgICB9O1xuICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgLypcbiAgICAgICAgICAgKiBUT0RPOiBnZXQgcmlkIG9mIGFsbCB0aGlzIGNvZGUgb25jZSBTYWZhcmkgc3VwcG9ydHMgbmVnYXRpdmUgbG9va2JlaGluZHMgaW4gcmVndWxhciBleHByZXNzaW9uc1xuICAgICAgICAgICAqIFRoZSBmb2xsb3dpbmcgaXMgUmVnRXhwIHRoYXQgaGFuZGxlcyB0aGUgc2FtZSBzdHVmZiBhcyB0aGUgSlMgY29kZSBiZWxvdzpcbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIC8oPzooPzooPzwhXFxdXFwoKSkoPzpodHRwc3xodHRwKTpcXC9cXC8pKD86W15cXHMvJC4/I11bXlxcc10qKD88IVtcXC4pXSkpL2dpO1xuICAgICAgICAgICAqXG4gICAgICAgICAgICogRGVtbyBvbiByZWdleDEwMTogaHR0cHM6Ly9yZWdleDEwMS5jb20vci83Vmw5YmcvMVxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQ2hlY2sgbG9va2JlaGluZCBzdXBwb3J0IGhlcmU6IGh0dHBzOi8vY2FuaXVzZS5jb20vP3NlYXJjaD1sb29rYmVoaW5kXG4gICAgICAgICAgICovXG4gICAgICAgICAgY29uc3QgbGFzdFVybENoYXJhY3RlckluZGV4ID0gcmF3TGlua01hdGNoLmluZGV4ICsgdXJsLmxlbmd0aCAtIDE7XG4gICAgICAgICAgY29uc3QgdGV4dFVzZWRUb1BlcmZvcm1NYXRjaGluZyA9IHJhd0xpbmtNYXRjaC5pbnB1dDtcbiAgICAgICAgICBjb25zdCBsYXN0Q2hhcmFjdGVySW5VcmwgPSB0ZXh0VXNlZFRvUGVyZm9ybU1hdGNoaW5nW2xhc3RVcmxDaGFyYWN0ZXJJbmRleF07XG4gICAgICAgICAgaWYgKGxhc3RDaGFyYWN0ZXJJblVybCA9PT0gJy4nKSB7XG4gICAgICAgICAgICBjb25zdCBjaGFyYWN0ZXJBZnRlclVybCA9IHRleHRVc2VkVG9QZXJmb3JtTWF0Y2hpbmdbbGFzdFVybENoYXJhY3RlckluZGV4ICsgMV07XG4gICAgICAgICAgICBpZiAoIWNoYXJhY3RlckFmdGVyVXJsIHx8IGNoYXJhY3RlckFmdGVyVXJsID09PSAnICcgfHwgY2hhcmFjdGVyQWZ0ZXJVcmwgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHVybFdpdGhvdXREb3RBdFRoZUVuZCA9IHVybC5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgICAgIHdyYXBVcmxJbkFuY2hvcih1cmxXaXRob3V0RG90QXRUaGVFbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAocmF3TGlua01hdGNoLmluZGV4ID4gMykge1xuICAgICAgICAgICAgY29uc3QgdHdvQ2hhcmFjdGVyc0luRnJvbnRPZlRoZUxpbmsgPSBgJHt0ZXh0VXNlZFRvUGVyZm9ybU1hdGNoaW5nW3Jhd0xpbmtNYXRjaC5pbmRleCAtIDJdfSR7XG4gICAgICAgICAgICAgIHRleHRVc2VkVG9QZXJmb3JtTWF0Y2hpbmdbcmF3TGlua01hdGNoLmluZGV4IC0gMV1cbiAgICAgICAgICAgIH1gO1xuICAgICAgICAgICAgaWYgKHR3b0NoYXJhY3RlcnNJbkZyb250T2ZUaGVMaW5rICYmIHR3b0NoYXJhY3RlcnNJbkZyb250T2ZUaGVMaW5rICE9PSAnXSgnKSB7XG4gICAgICAgICAgICAgIC8vIG9ubHkgd3JhcCB1cmwgaW4gYW5jaG9yIHdoZW4gaXQgaXMgbm90IGEgbmFtZWQgbWFya2Rvd24gbGlua1xuICAgICAgICAgICAgICB3cmFwVXJsSW5BbmNob3IodXJsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd3JhcFVybEluQW5jaG9yKHVybCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgbGV0IHRleHRXaXRoUmF3QW5kTmFtZWRMaW5rcyA9IHRleHRXaXRoUmF3TGlua3M7XG4gICAgICBjb25zdCBuYW1lZExpbmtNYXRjaGVzID0gdGhpcy5nZXRBbGxSZWdleE1hdGNoZXMoTHhMaW5raWZ5UGlwZS5OQU1FRF9MSU5LX1JFR0VYLCB0ZXh0V2l0aFJhd0xpbmtzKTtcbiAgICAgIG5hbWVkTGlua01hdGNoZXMuZm9yRWFjaCgobmFtZWRMaW5rTWF0Y2gpID0+IHtcbiAgICAgICAgY29uc3QgW3NvdXJjZSwgbmFtZSwgdXJsXSA9IG5hbWVkTGlua01hdGNoO1xuICAgICAgICBjb25zdCB1cmxJc1ZhbGlkID0gdXJsICYmICEvamF2YXNjcmlwdFxcOi9pLnRlc3QodXJsKTtcbiAgICAgICAgaWYgKHNvdXJjZSAmJiBuYW1lICYmIHVybElzVmFsaWQpIHtcbiAgICAgICAgICB0ZXh0V2l0aFJhd0FuZE5hbWVkTGlua3MgPSB0ZXh0V2l0aFJhd0FuZE5hbWVkTGlua3MucmVwbGFjZShcbiAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgIGA8YSBocmVmPVwiJHt1cmx9XCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPiR7bmFtZX08L2E+YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gdGV4dFdpdGhSYXdBbmROYW1lZExpbmtzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEFsbFJlZ2V4TWF0Y2hlcyhyZWdleDogUmVnRXhwLCBpbnB1dDogc3RyaW5nKSB7XG4gICAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xuICAgIGNvbnN0IG1hdGNoZXMgPSBbXTtcbiAgICB3aGlsZSAoKG1hdGNoID0gcmVnZXguZXhlYyhpbnB1dCkpICE9PSBudWxsKSB7XG4gICAgICBtYXRjaGVzLnB1c2gobWF0Y2gpO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hlcztcbiAgfVxufVxuIl19
130
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlua2lmeS5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3NyYy9saWIvY29yZS11aS9waXBlcy9saW5raWZ5L2xpbmtpZnkucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQzs7QUFFcEQ7Ozs7Ozs7OztHQVNHO0FBRUgsTUFBTSxPQUFPLGFBQWE7SUErQnhCLFNBQVMsQ0FBQyxJQUFvQjtRQUM1QixJQUFJLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDcEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkUsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsb0NBQW9DLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUM3RixPQUFPLHdCQUF3QixDQUFDO1NBQ2pDO2FBQU07WUFDTCxPQUFPLElBQUksQ0FBQztTQUNiO0lBQ0gsQ0FBQztJQUVPLG9DQUFvQyxDQUFDLElBQVk7UUFDdkQsSUFBSSx3QkFBd0IsR0FBRyxJQUFJLENBQUM7UUFDcEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZGLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLGNBQWMsRUFBRSxFQUFFO1lBQzFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLGNBQWMsQ0FBQztZQUMzQyxNQUFNLFVBQVUsR0FBRyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3JELElBQUksTUFBTSxJQUFJLElBQUksSUFBSSxVQUFVLEVBQUU7Z0JBQ2hDLHdCQUF3QixHQUFHLHdCQUF3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QyxLQUFLLElBQUksRUFBRTtZQUMzQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3JCO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQzs7QUFwSEQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDb0IsNkJBQWUsR0FBRywyQ0FBNEMsQ0FBQTtBQUVyRjs7Ozs7Ozs7OztHQVVHO0FBQ29CLDhCQUFnQixHQUFHLDJDQUE0QyxDQUFBOzBHQTdCM0UsYUFBYTt3R0FBYixhQUFhOzJGQUFiLGFBQWE7a0JBRHpCLElBQUk7bUJBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIFRoaXMgcGlwZSB0cmFuc2Zvcm1zLi4uXG4gKiAtIFwicmF3XCIgaHR0cChzKSBsaW5rc1xuICogLSBtYXJrZG93biBsaW5rIHN5bnRheFxuICogLi4uIGludG8gY2xpY2thYmxlIGFuY2hvciBlbGVtZW50cy5cbiAqXG4gKiBZb3UgaGF2ZSBhbiB1c2VyIGludGVyZmFjZSB3aGVyZSB5b3UgZG9uJ3Qgd2FudCBjbGlja2FibGUgbGlua3MgYnV0IGFsc29cbiAqIGRvbid0IHdhbnQgdXNlcnMgdG8gc2VlIHRoZSBcInVnbHlcIiBtYXJrZG93biBsaW5rIHN5bnRheD9cbiAqIC0+IFVzZSB0aGUgJ2x4VW5saWtpZnknIHBpcGUgdG8gcmVwbGFjZSBtYXJrZG93biBsaW5rIHN5bnRheCB3aXRoIGp1c3QgdGhlIGxpbmsgbmFtZVxuICovXG5AUGlwZSh7IG5hbWU6ICdseExpbmtpZnknIH0pXG5leHBvcnQgY2xhc3MgTHhMaW5raWZ5UGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICAvKipcbiAgICogVGhpcyBpcyBub3QgdGhlIFwib25lIFVSTCByZWdleCB0byBydWxlIHRoZW0gYWxsXCIsIGJ1dCBhIG1vcmUgcmVhbGlzdGljIG9uZSB3aGljaCBzaG91bGQgd29ya1xuICAgKiBmb3IgYW55IFVSTHMgdGhhdCBvdXIgY3VzdG9tZXJzIGluY2x1ZGUgaW4gdGV4dCBmaWVsZHMgb24gYSBGYWN0IFNoZWV0LlxuICAgKlxuICAgKiBSZWdleCBydWxlcyBleHBsYWluZWQgaW4gcGxhaW4gdGV4dDpcbiAgICpcbiAgICogKD86KD86aHR0cHM/KTpcXC9cXC8pICAgICAgIC0+ICAgIExpbmtzIG11c3Qgc3RhcnQgd2l0aCBcImh0dHBzOi8vXCIgb3IgXCJodHRwOi8vXCJcbiAgICpcbiAgICogKD86W15cXHMvJC4/I11bXlxcc10qKD88IVtcXC4pXSkpIExFVCdTIFNQTElUIFRISVMgT05FIFVQXG4gICAqXG4gICAqIFteXFxzLyQuPyNdW15cXHNdKiAgIC0+ICAgIE1hdGNoIGFueSBsZWdhbCBVUkwgY2hhcmFjdGVyIHVudGlsIHRoZSBuZXh0IHdoaXRlc3BhY2VcbiAgICogKD88IVtcXC4pXSAgICAgICAgICAtPiAgICBBIG5lZ2F0aXZlIGxvb2thaGVhZCB0byBwcmV2ZW50IG1hdGNoaW5nIGEgZG90IG9yIHBhcmVudGhlc2lzIGZvbGxvd2luZyBhIFVSTFxuICAgKlxuICAgKiBMaW5rIHRvIHJlZ2V4MTAxOiBodHRwczovL3JlZ2V4MTAxLmNvbS9yL2QzS3RmSC8xIChOT1RFOiBwbGVhc2UgdXBkYXRlIHRoaXMgbGluayB3aGVuIGNoYW5naW5nIHRoZSByZWdleClcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgSFRUUF9MSU5LX1JFR0VYID0gLyg/Oig/Omh0dHBzPyk6XFwvXFwvKSg/OlteXFxzLyQuPyNdW15cXHNdKikvZ2k7XG5cbiAgLyoqXG4gICAqIFRoaXMgd2lsbCBtYXRjaCB0aGUgbWFya2Rvd24gbGluayBzeW50YXg6IFtsaW5rIG5hbWVdKHVybClcbiAgICogUmVnZXggcnVsZXMgZXhwbGFpbmVkIGluIHBsYWluIHRleHQ6XG4gICAqXG4gICAqICg/OlxcWyhbXlxcXV0qKVxcXSkgICAgICAgICAgICAtPiAgICAgTWF0Y2ggYW55IGNoYXJhY3RlcnMgaW5zaWRlIHNxdWFyZSBicmFja2V0c1xuICAgKiBcXCgoW15cXHNcXC8kLj8jXVteXFxzXSopXFwpICAgICAtPiAgICAgTm90aWNlIHRoYXQgdGhpcyBpcyB0aGUgc2FtZSByZWdleCBhcyB0aGUgSFRUUF9MSU5LX1JFR0VYIGFib3ZlLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCB3aXRob3V0IHRoZSByZXF1aXJlbWVudCBmb3IgdGhlIGh0dHAgcHJvdG9jb2wuXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBhbGxvd3MgZm9yIGxpbmtzIHdpdGhvdXQgaW5jbHVkaW5nIHRoZSBwcm90b2NvbCBvciBhbHNvIFwibWFpbHRvOmhlbGxvQHdvcmxkLmRlXCIgbGlua3NcbiAgICpcbiAgICogTGluayB0byByZWdleDEwMTogaHR0cHM6Ly9yZWdleDEwMS5jb20vci81VU1VSDgvMVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBOQU1FRF9MSU5LX1JFR0VYID0gLyg/OlxcWyhbXlxcXV0qKVxcXSlcXCgoW15cXHNcXC8kLj8jXVteXFxzXSopXFwpL2dpO1xuXG4gIHRyYW5zZm9ybSh0ZXh0Pzogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwge1xuICAgIGlmICh0ZXh0ICYmIHR5cGVvZiB0ZXh0ID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgdGV4dFdpdGhSYXdMaW5rcyA9IHRoaXMud3JhcFJhd0h0dHBMaW5rc1dpdGhBbmNob3JUYWdzKHRleHQpO1xuICAgICAgY29uc3QgdGV4dFdpdGhSYXdBbmROYW1lZExpbmtzID0gdGhpcy50dXJuTWFya2Rvd25TdHlsZUxpbmtzSW50b0FuY2hvclRhZ3ModGV4dFdpdGhSYXdMaW5rcyk7XG4gICAgICByZXR1cm4gdGV4dFdpdGhSYXdBbmROYW1lZExpbmtzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHR1cm5NYXJrZG93blN0eWxlTGlua3NJbnRvQW5jaG9yVGFncyh0ZXh0OiBzdHJpbmcpIHtcbiAgICBsZXQgdGV4dFdpdGhSYXdBbmROYW1lZExpbmtzID0gdGV4dDtcbiAgICBjb25zdCBuYW1lZExpbmtNYXRjaGVzID0gdGhpcy5nZXRBbGxSZWdleE1hdGNoZXMoTHhMaW5raWZ5UGlwZS5OQU1FRF9MSU5LX1JFR0VYLCB0ZXh0KTtcbiAgICBuYW1lZExpbmtNYXRjaGVzLmZvckVhY2goKG5hbWVkTGlua01hdGNoKSA9PiB7XG4gICAgICBjb25zdCBbc291cmNlLCBuYW1lLCB1cmxdID0gbmFtZWRMaW5rTWF0Y2g7XG4gICAgICBjb25zdCB1cmxJc1ZhbGlkID0gdXJsICYmICEvamF2YXNjcmlwdFxcOi9pLnRlc3QodXJsKTtcbiAgICAgIGlmIChzb3VyY2UgJiYgbmFtZSAmJiB1cmxJc1ZhbGlkKSB7XG4gICAgICAgIHRleHRXaXRoUmF3QW5kTmFtZWRMaW5rcyA9IHRleHRXaXRoUmF3QW5kTmFtZWRMaW5rcy5yZXBsYWNlKFxuICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICBgPGEgaHJlZj1cIiR7dXJsfVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIj4ke25hbWV9PC9hPmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGV4dFdpdGhSYXdBbmROYW1lZExpbmtzO1xuICB9XG5cbiAgcHJpdmF0ZSB3cmFwUmF3SHR0cExpbmtzV2l0aEFuY2hvclRhZ3ModGV4dDogc3RyaW5nKSB7XG4gICAgbGV0IHRleHRXaXRoUmF3TGlua3MgPSB0ZXh0O1xuICAgIC8qKlxuICAgICAqIEtlZXBpbmcgdHJhY2sgb2YgdGhpcyBpbmRleCBwcmV2ZW50cyBpbmZpbml0ZSBsb29wc1xuICAgICAqIHdoZXJlIGEgcHJldmlvdXNseSBwcm9jZXNzZWQgbGluayBzdGFydHMgd2l0aCB0aGUgc2FtZSBjaGFyYWN0ZXJzXG4gICAgICogYXMgYSBzZWNvbmQgbGluay5cbiAgICAgKiBlLmcuIGh0dHBzOi8vYW5ndWxhci5pby9kb2NzIGZvbGxvd2VkIGJ5IGh0dHBzOi8vYW5ndWxhci5pb1xuICAgICAqL1xuICAgIGxldCBuZXh0SW5kZXhUb1N0YXJ0UmVwbGFjaW5nRnJvbSA9IDA7XG4gICAgY29uc3QgcmF3TGlua01hdGNoZXMgPSB0aGlzLmdldEFsbFJlZ2V4TWF0Y2hlcyhMeExpbmtpZnlQaXBlLkhUVFBfTElOS19SRUdFWCwgdGV4dCk7XG4gICAgcmF3TGlua01hdGNoZXMuZm9yRWFjaCgocmF3TGlua01hdGNoKSA9PiB7XG4gICAgICBjb25zdCBbdXJsXSA9IHJhd0xpbmtNYXRjaDtcbiAgICAgIGNvbnN0IHdyYXBVcmxJbkFuY2hvciA9IChzYW5pdGl6ZWRVcmxNYXRjaDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpcnN0UGFydCA9IHRleHRXaXRoUmF3TGlua3Muc3Vic3RyaW5nKDAsIG5leHRJbmRleFRvU3RhcnRSZXBsYWNpbmdGcm9tKTtcbiAgICAgICAgY29uc3QgYW5jaG9yVGFnSHRtbCA9IGA8YSBocmVmPVwiJHtzYW5pdGl6ZWRVcmxNYXRjaH1cIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+JHtzYW5pdGl6ZWRVcmxNYXRjaH08L2E+YDtcbiAgICAgICAgY29uc3Qgc2Vjb25kUGFydCA9IHRleHRXaXRoUmF3TGlua3Muc3Vic3RyaW5nKG5leHRJbmRleFRvU3RhcnRSZXBsYWNpbmdGcm9tKS5yZXBsYWNlKHNhbml0aXplZFVybE1hdGNoISwgYW5jaG9yVGFnSHRtbCk7XG4gICAgICAgIHRleHRXaXRoUmF3TGlua3MgPSBmaXJzdFBhcnQgKyBzZWNvbmRQYXJ0O1xuICAgICAgICBuZXh0SW5kZXhUb1N0YXJ0UmVwbGFjaW5nRnJvbSA9IHJhd0xpbmtNYXRjaC5pbmRleCArIGFuY2hvclRhZ0h0bWwubGVuZ3RoO1xuICAgICAgfTtcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgLypcbiAgICAgICAgICogVE9ETzogZ2V0IHJpZCBvZiBhbGwgdGhpcyBjb2RlIG9uY2UgU2FmYXJpIHN1cHBvcnRzIG5lZ2F0aXZlIGxvb2tiZWhpbmRzIGluIHJlZ3VsYXIgZXhwcmVzc2lvbnNcbiAgICAgICAgICogVGhlIGZvbGxvd2luZyBpcyBSZWdFeHAgdGhhdCBoYW5kbGVzIHRoZSBzYW1lIHN0dWZmIGFzIHRoZSBKUyBjb2RlIGJlbG93OlxuICAgICAgICAgKlxuICAgICAgICAgKiAvKD86KD86KD88IVxcXVxcKCkpKD86aHR0cHN8aHR0cCk6XFwvXFwvKSg/OlteXFxzLyQuPyNdW15cXHNdKig/PCFbXFwuKV0pKS9naTtcbiAgICAgICAgICpcbiAgICAgICAgICogRGVtbyBvbiByZWdleDEwMTogaHR0cHM6Ly9yZWdleDEwMS5jb20vci83Vmw5YmcvMVxuICAgICAgICAgKlxuICAgICAgICAgKiBDaGVjayBsb29rYmVoaW5kIHN1cHBvcnQgaGVyZTogaHR0cHM6Ly9jYW5pdXNlLmNvbS8/c2VhcmNoPWxvb2tiZWhpbmRcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGxhc3RVcmxDaGFyYWN0ZXJJbmRleCA9IHJhd0xpbmtNYXRjaC5pbmRleCArIHVybC5sZW5ndGggLSAxO1xuICAgICAgICBjb25zdCB0ZXh0VXNlZFRvUGVyZm9ybU1hdGNoaW5nID0gcmF3TGlua01hdGNoLmlucHV0O1xuICAgICAgICBjb25zdCBsYXN0Q2hhcmFjdGVySW5VcmwgPSB0ZXh0VXNlZFRvUGVyZm9ybU1hdGNoaW5nW2xhc3RVcmxDaGFyYWN0ZXJJbmRleF07XG4gICAgICAgIGNvbnN0IHR3b0NoYXJhY3RlcnNJbkZyb250T2ZUaGVMaW5rID1cbiAgICAgICAgICByYXdMaW5rTWF0Y2guaW5kZXggPiAzXG4gICAgICAgICAgICA/IGAke3RleHRVc2VkVG9QZXJmb3JtTWF0Y2hpbmdbcmF3TGlua01hdGNoLmluZGV4IC0gMl19JHt0ZXh0VXNlZFRvUGVyZm9ybU1hdGNoaW5nW3Jhd0xpbmtNYXRjaC5pbmRleCAtIDFdfWBcbiAgICAgICAgICAgIDogJyc7XG4gICAgICAgIGNvbnN0IGlzTWFya2Rvd25TeW50YXhMaW5rID0gdHdvQ2hhcmFjdGVyc0luRnJvbnRPZlRoZUxpbmsgPT09ICddKCc7XG5cbiAgICAgICAgaWYgKCFpc01hcmtkb3duU3ludGF4TGluayAmJiBsYXN0Q2hhcmFjdGVySW5VcmwgPT09ICcuJykge1xuICAgICAgICAgIGNvbnN0IGNoYXJhY3RlckFmdGVyVXJsID0gdGV4dFVzZWRUb1BlcmZvcm1NYXRjaGluZ1tsYXN0VXJsQ2hhcmFjdGVySW5kZXggKyAxXTtcbiAgICAgICAgICBpZiAoIWNoYXJhY3RlckFmdGVyVXJsIHx8IGNoYXJhY3RlckFmdGVyVXJsID09PSAnICcgfHwgY2hhcmFjdGVyQWZ0ZXJVcmwgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICBjb25zdCB1cmxXaXRob3V0RG90QXRUaGVFbmQgPSB1cmwuc2xpY2UoMCwgLTEpO1xuICAgICAgICAgICAgd3JhcFVybEluQW5jaG9yKHVybFdpdGhvdXREb3RBdFRoZUVuZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCFpc01hcmtkb3duU3ludGF4TGluaykge1xuICAgICAgICAgIHdyYXBVcmxJbkFuY2hvcih1cmwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRleHRXaXRoUmF3TGlua3M7XG4gIH1cblxuICBwcml2YXRlIGdldEFsbFJlZ2V4TWF0Y2hlcyhyZWdleDogUmVnRXhwLCBpbnB1dDogc3RyaW5nKSB7XG4gICAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xuICAgIGNvbnN0IG1hdGNoZXMgPSBbXTtcbiAgICB3aGlsZSAoKG1hdGNoID0gcmVnZXguZXhlYyhpbnB1dCkpICE9PSBudWxsKSB7XG4gICAgICBtYXRjaGVzLnB1c2gobWF0Y2gpO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hlcztcbiAgfVxufVxuIl19
@@ -1,4 +1,5 @@
1
1
  import { Injectable } from '@angular/core';
2
+ import { timer } from 'rxjs';
2
3
  import * as i0 from "@angular/core";
3
4
  function isResizeableElement(element) {
4
5
  return element && !!element.handleResize;
@@ -19,7 +20,16 @@ function isResizeableElement(element) {
19
20
  export class ResizeObserverService {
20
21
  observe(element, callback, options) {
21
22
  if (!this.resizeObserver) {
22
- this.resizeObserver = new ResizeObserver(this.resizeObserverCallback.bind(this));
23
+ try {
24
+ this.resizeObserver = new ResizeObserver(this.resizeObserverCallback.bind(this));
25
+ }
26
+ catch {
27
+ // All the browsers we support implement the ResizeObserver API.
28
+ // For unsupported browsers, there's this "one time artifical resize event".
29
+ // They will not get the functionality tied to later resize events.
30
+ timer(500).subscribe(() => callback(this.getMockOneTimeResizeEventForUnsupportedBrowsers(element)));
31
+ return;
32
+ }
23
33
  }
24
34
  element.handleResize = callback;
25
35
  this.resizeObserver.observe(element, options);
@@ -37,6 +47,45 @@ export class ResizeObserverService {
37
47
  }
38
48
  });
39
49
  }
50
+ /**
51
+ * All browsers we officially support implement the ResizeObserver API.
52
+ * Still as a curtesy do customers who for some reason have older browsers
53
+ * we call the callback once with the initial dimensions of the element
54
+ * and then do not react on resize events afterwards.
55
+ * This should still make them happier than a "browser not supported" warning.
56
+ */
57
+ getMockOneTimeResizeEventForUnsupportedBrowsers(element) {
58
+ const contentRect = {
59
+ bottom: element.clientHeight,
60
+ height: element.clientHeight,
61
+ left: 0,
62
+ right: element.clientWidth,
63
+ top: 0,
64
+ width: element.clientWidth,
65
+ x: 0,
66
+ y: 0
67
+ };
68
+ return {
69
+ borderBoxSize: [{ blockSize: element.clientHeight, inlineSize: element.clientWidth }],
70
+ contentBoxSize: [
71
+ {
72
+ blockSize: element.clientHeight,
73
+ inlineSize: element.clientWidth
74
+ }
75
+ ],
76
+ contentRect: {
77
+ ...contentRect,
78
+ toJSON: () => JSON.stringify(contentRect)
79
+ },
80
+ devicePixelContentBoxSize: [
81
+ {
82
+ blockSize: element.clientWidth,
83
+ inlineSize: element.clientWidth
84
+ }
85
+ ],
86
+ target: element
87
+ };
88
+ }
40
89
  }
41
90
  ResizeObserverService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: ResizeObserverService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
42
91
  ResizeObserverService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: ResizeObserverService, providedIn: 'root' });
@@ -44,4 +93,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImpor
44
93
  type: Injectable,
45
94
  args: [{ providedIn: 'root' }]
46
95
  }] });
47
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplLW9ic2VydmVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvc3JjL2xpYi9jb3JlLXVpL3NlcnZpY2VzL3Jlc2l6ZS1vYnNlcnZlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBUTNDLFNBQVMsbUJBQW1CLENBQUMsT0FBWTtJQUN2QyxPQUFPLE9BQU8sSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztBQUMzQyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBRUgsTUFBTSxPQUFPLHFCQUFxQjtJQUdoQyxPQUFPLENBQUMsT0FBMEIsRUFBRSxRQUFrQyxFQUFFLE9BQStCO1FBQ3JHLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3hCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ2xGO1FBQ0QsT0FBTyxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUM7UUFDaEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxTQUFTLENBQUMsT0FBb0I7UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDeEIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVPLHNCQUFzQixDQUFDLE9BQThCLEVBQUUsU0FBeUI7UUFDdEYsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3hCLElBQUksbUJBQW1CLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNyQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNsQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7a0hBeEJVLHFCQUFxQjtzSEFBckIscUJBQXFCLGNBRFIsTUFBTTsyRkFDbkIscUJBQXFCO2tCQURqQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IHR5cGUgTHhSZXNpemVPYnNlcnZlckNhbGxiYWNrID0gKHJlc2l6ZWRFbGVtZW50OiBSZXNpemVPYnNlcnZlckVudHJ5KSA9PiB2b2lkO1xuXG5pbnRlcmZhY2UgUmVzaXplYWJsZUVsZW1lbnQgZXh0ZW5kcyBFbGVtZW50IHtcbiAgaGFuZGxlUmVzaXplOiBMeFJlc2l6ZU9ic2VydmVyQ2FsbGJhY2s7XG59XG5cbmZ1bmN0aW9uIGlzUmVzaXplYWJsZUVsZW1lbnQoZWxlbWVudDogYW55KTogZWxlbWVudCBpcyBSZXNpemVhYmxlRWxlbWVudCB7XG4gIHJldHVybiBlbGVtZW50ICYmICEhZWxlbWVudC5oYW5kbGVSZXNpemU7XG59XG5cbi8qKlxuICogU2hhcmluZyBvbmUgUmVzaXplT2JzZXJ2ZXIgb2JqZWN0IHJlc3VsdHMgaW4gbXVjaCBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAqIG92ZXIgaW5kaXZpZHVhbCBjb21wb25lbnRzIGNyZWF0aW5nIHRoZWlyIG93biBSZXNpemVPYnNlcnZlci5cbiAqIFRoaXMgaXMgd2h5IHRoaXMgc2VydmljZSBleGlzdHMuXG4gKiBTb3VyY2U6XG4gKiAtIGh0dHBzOi8vZ2l0aHViLmNvbS9XSUNHL3Jlc2l6ZS1vYnNlcnZlci9pc3N1ZXMvNTkjaXNzdWVjb21tZW50LTQwODA5ODE1MVxuICogLSBodHRwczovL2dyb3Vwcy5nb29nbGUuY29tL2EvY2hyb21pdW0ub3JnL2cvYmxpbmstZGV2L2MvejZpZW5PTlViNUEvbS9GNS1WY1VadEJBQUpcbiAqXG4gKiBMZWFybiBtb3JlIGFib3V0IHRoZSBSZXNpemVPYnNlcnZlciBBUEk6XG4gKiAtIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9yZXNpemUtb2JzZXJ2ZXIvXG4gKiAtIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9SZXNpemVPYnNlcnZlclxuICogLSBodHRwczovL3d3dy5kaWdpdGFsb2NlYW4uY29tL2NvbW11bml0eS90dXRvcmlhbHMvanMtcmVzaXplLW9ic2VydmVyXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgUmVzaXplT2JzZXJ2ZXJTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZXNpemVPYnNlcnZlcj86IFJlc2l6ZU9ic2VydmVyO1xuXG4gIG9ic2VydmUoZWxlbWVudDogUmVzaXplYWJsZUVsZW1lbnQsIGNhbGxiYWNrOiBMeFJlc2l6ZU9ic2VydmVyQ2FsbGJhY2ssIG9wdGlvbnM/OiBSZXNpemVPYnNlcnZlck9wdGlvbnMpIHtcbiAgICBpZiAoIXRoaXMucmVzaXplT2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIodGhpcy5yZXNpemVPYnNlcnZlckNhbGxiYWNrLmJpbmQodGhpcykpO1xuICAgIH1cbiAgICBlbGVtZW50LmhhbmRsZVJlc2l6ZSA9IGNhbGxiYWNrO1xuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShlbGVtZW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIHVub2JzZXJ2ZShlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgIGlmICghdGhpcy5yZXNpemVPYnNlcnZlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLnVub2JzZXJ2ZShlbGVtZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzaXplT2JzZXJ2ZXJDYWxsYmFjayhlbnRyaWVzOiBSZXNpemVPYnNlcnZlckVudHJ5W10sIF9vYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXIpIHtcbiAgICBlbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICBpZiAoaXNSZXNpemVhYmxlRWxlbWVudChlbnRyeS50YXJnZXQpKSB7XG4gICAgICAgIGVudHJ5LnRhcmdldC5oYW5kbGVSZXNpemUoZW50cnkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iXX0=
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplLW9ic2VydmVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvc3JjL2xpYi9jb3JlLXVpL3NlcnZpY2VzL3Jlc2l6ZS1vYnNlcnZlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFRN0IsU0FBUyxtQkFBbUIsQ0FBQyxPQUFZO0lBQ3ZDLE9BQU8sT0FBTyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDO0FBQzNDLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFFSCxNQUFNLE9BQU8scUJBQXFCO0lBR2hDLE9BQU8sQ0FBQyxPQUEwQixFQUFFLFFBQWtDLEVBQUUsT0FBK0I7UUFDckcsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDeEIsSUFBSTtnQkFDRixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzthQUNsRjtZQUFDLE1BQU07Z0JBQ04sZ0VBQWdFO2dCQUNoRSw0RUFBNEU7Z0JBQzVFLG1FQUFtRTtnQkFDbkUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLCtDQUErQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEcsT0FBTzthQUNSO1NBQ0Y7UUFDRCxPQUFPLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQztRQUNoQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELFNBQVMsQ0FBQyxPQUFvQjtRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN4QixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRU8sc0JBQXNCLENBQUMsT0FBOEIsRUFBRSxTQUF5QjtRQUN0RixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDeEIsSUFBSSxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3JDLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2xDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssK0NBQStDLENBQUMsT0FBMEI7UUFDaEYsTUFBTSxXQUFXLEdBQUc7WUFDbEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxZQUFZO1lBQzVCLE1BQU0sRUFBRSxPQUFPLENBQUMsWUFBWTtZQUM1QixJQUFJLEVBQUUsQ0FBQztZQUNQLEtBQUssRUFBRSxPQUFPLENBQUMsV0FBVztZQUMxQixHQUFHLEVBQUUsQ0FBQztZQUNOLEtBQUssRUFBRSxPQUFPLENBQUMsV0FBVztZQUMxQixDQUFDLEVBQUUsQ0FBQztZQUNKLENBQUMsRUFBRSxDQUFDO1NBQ0wsQ0FBQztRQUNGLE9BQU87WUFDTCxhQUFhLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckYsY0FBYyxFQUFFO2dCQUNkO29CQUNFLFNBQVMsRUFBRSxPQUFPLENBQUMsWUFBWTtvQkFDL0IsVUFBVSxFQUFFLE9BQU8sQ0FBQyxXQUFXO2lCQUNoQzthQUNGO1lBQ0QsV0FBVyxFQUFFO2dCQUNYLEdBQUcsV0FBVztnQkFDZCxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUM7YUFDMUM7WUFDRCx5QkFBeUIsRUFBRTtnQkFDekI7b0JBQ0UsU0FBUyxFQUFFLE9BQU8sQ0FBQyxXQUFXO29CQUM5QixVQUFVLEVBQUUsT0FBTyxDQUFDLFdBQVc7aUJBQ2hDO2FBQ0Y7WUFDRCxNQUFNLEVBQUUsT0FBTztTQUNoQixDQUFDO0lBQ0osQ0FBQzs7a0hBeEVVLHFCQUFxQjtzSEFBckIscUJBQXFCLGNBRFIsTUFBTTsyRkFDbkIscUJBQXFCO2tCQURqQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRpbWVyIH0gZnJvbSAncnhqcyc7XG5cbmV4cG9ydCB0eXBlIEx4UmVzaXplT2JzZXJ2ZXJDYWxsYmFjayA9IChyZXNpemVkRWxlbWVudDogUmVzaXplT2JzZXJ2ZXJFbnRyeSkgPT4gdm9pZDtcblxuaW50ZXJmYWNlIFJlc2l6ZWFibGVFbGVtZW50IGV4dGVuZHMgRWxlbWVudCB7XG4gIGhhbmRsZVJlc2l6ZTogTHhSZXNpemVPYnNlcnZlckNhbGxiYWNrO1xufVxuXG5mdW5jdGlvbiBpc1Jlc2l6ZWFibGVFbGVtZW50KGVsZW1lbnQ6IGFueSk6IGVsZW1lbnQgaXMgUmVzaXplYWJsZUVsZW1lbnQge1xuICByZXR1cm4gZWxlbWVudCAmJiAhIWVsZW1lbnQuaGFuZGxlUmVzaXplO1xufVxuXG4vKipcbiAqIFNoYXJpbmcgb25lIFJlc2l6ZU9ic2VydmVyIG9iamVjdCByZXN1bHRzIGluIG11Y2ggYmV0dGVyIHBlcmZvcm1hbmNlXG4gKiBvdmVyIGluZGl2aWR1YWwgY29tcG9uZW50cyBjcmVhdGluZyB0aGVpciBvd24gUmVzaXplT2JzZXJ2ZXIuXG4gKiBUaGlzIGlzIHdoeSB0aGlzIHNlcnZpY2UgZXhpc3RzLlxuICogU291cmNlOlxuICogLSBodHRwczovL2dpdGh1Yi5jb20vV0lDRy9yZXNpemUtb2JzZXJ2ZXIvaXNzdWVzLzU5I2lzc3VlY29tbWVudC00MDgwOTgxNTFcbiAqIC0gaHR0cHM6Ly9ncm91cHMuZ29vZ2xlLmNvbS9hL2Nocm9taXVtLm9yZy9nL2JsaW5rLWRldi9jL3o2aWVuT05VYjVBL20vRjUtVmNVWnRCQUFKXG4gKlxuICogTGVhcm4gbW9yZSBhYm91dCB0aGUgUmVzaXplT2JzZXJ2ZXIgQVBJOlxuICogLSBodHRwczovL3d3dy53My5vcmcvVFIvcmVzaXplLW9ic2VydmVyL1xuICogLSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvUmVzaXplT2JzZXJ2ZXJcbiAqIC0gaHR0cHM6Ly93d3cuZGlnaXRhbG9jZWFuLmNvbS9jb21tdW5pdHkvdHV0b3JpYWxzL2pzLXJlc2l6ZS1vYnNlcnZlclxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFJlc2l6ZU9ic2VydmVyU2VydmljZSB7XG4gIHByaXZhdGUgcmVzaXplT2JzZXJ2ZXI/OiBSZXNpemVPYnNlcnZlcjtcblxuICBvYnNlcnZlKGVsZW1lbnQ6IFJlc2l6ZWFibGVFbGVtZW50LCBjYWxsYmFjazogTHhSZXNpemVPYnNlcnZlckNhbGxiYWNrLCBvcHRpb25zPzogUmVzaXplT2JzZXJ2ZXJPcHRpb25zKSB7XG4gICAgaWYgKCF0aGlzLnJlc2l6ZU9ic2VydmVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKHRoaXMucmVzaXplT2JzZXJ2ZXJDYWxsYmFjay5iaW5kKHRoaXMpKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBBbGwgdGhlIGJyb3dzZXJzIHdlIHN1cHBvcnQgaW1wbGVtZW50IHRoZSBSZXNpemVPYnNlcnZlciBBUEkuXG4gICAgICAgIC8vIEZvciB1bnN1cHBvcnRlZCBicm93c2VycywgdGhlcmUncyB0aGlzIFwib25lIHRpbWUgYXJ0aWZpY2FsIHJlc2l6ZSBldmVudFwiLlxuICAgICAgICAvLyBUaGV5IHdpbGwgbm90IGdldCB0aGUgZnVuY3Rpb25hbGl0eSB0aWVkIHRvIGxhdGVyIHJlc2l6ZSBldmVudHMuXG4gICAgICAgIHRpbWVyKDUwMCkuc3Vic2NyaWJlKCgpID0+IGNhbGxiYWNrKHRoaXMuZ2V0TW9ja09uZVRpbWVSZXNpemVFdmVudEZvclVuc3VwcG9ydGVkQnJvd3NlcnMoZWxlbWVudCkpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBlbGVtZW50LmhhbmRsZVJlc2l6ZSA9IGNhbGxiYWNrO1xuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShlbGVtZW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIHVub2JzZXJ2ZShlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgIGlmICghdGhpcy5yZXNpemVPYnNlcnZlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLnVub2JzZXJ2ZShlbGVtZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzaXplT2JzZXJ2ZXJDYWxsYmFjayhlbnRyaWVzOiBSZXNpemVPYnNlcnZlckVudHJ5W10sIF9vYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXIpIHtcbiAgICBlbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICBpZiAoaXNSZXNpemVhYmxlRWxlbWVudChlbnRyeS50YXJnZXQpKSB7XG4gICAgICAgIGVudHJ5LnRhcmdldC5oYW5kbGVSZXNpemUoZW50cnkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbCBicm93c2VycyB3ZSBvZmZpY2lhbGx5IHN1cHBvcnQgaW1wbGVtZW50IHRoZSBSZXNpemVPYnNlcnZlciBBUEkuXG4gICAqIFN0aWxsIGFzIGEgY3VydGVzeSBkbyBjdXN0b21lcnMgd2hvIGZvciBzb21lIHJlYXNvbiBoYXZlIG9sZGVyIGJyb3dzZXJzXG4gICAqIHdlIGNhbGwgdGhlIGNhbGxiYWNrIG9uY2Ugd2l0aCB0aGUgaW5pdGlhbCBkaW1lbnNpb25zIG9mIHRoZSBlbGVtZW50XG4gICAqIGFuZCB0aGVuIGRvIG5vdCByZWFjdCBvbiByZXNpemUgZXZlbnRzIGFmdGVyd2FyZHMuXG4gICAqIFRoaXMgc2hvdWxkIHN0aWxsIG1ha2UgdGhlbSBoYXBwaWVyIHRoYW4gYSBcImJyb3dzZXIgbm90IHN1cHBvcnRlZFwiIHdhcm5pbmcuXG4gICAqL1xuICBwcml2YXRlIGdldE1vY2tPbmVUaW1lUmVzaXplRXZlbnRGb3JVbnN1cHBvcnRlZEJyb3dzZXJzKGVsZW1lbnQ6IFJlc2l6ZWFibGVFbGVtZW50KSB7XG4gICAgY29uc3QgY29udGVudFJlY3QgPSB7XG4gICAgICBib3R0b206IGVsZW1lbnQuY2xpZW50SGVpZ2h0LFxuICAgICAgaGVpZ2h0OiBlbGVtZW50LmNsaWVudEhlaWdodCxcbiAgICAgIGxlZnQ6IDAsXG4gICAgICByaWdodDogZWxlbWVudC5jbGllbnRXaWR0aCxcbiAgICAgIHRvcDogMCxcbiAgICAgIHdpZHRoOiBlbGVtZW50LmNsaWVudFdpZHRoLFxuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICBib3JkZXJCb3hTaXplOiBbeyBibG9ja1NpemU6IGVsZW1lbnQuY2xpZW50SGVpZ2h0LCBpbmxpbmVTaXplOiBlbGVtZW50LmNsaWVudFdpZHRoIH1dLFxuICAgICAgY29udGVudEJveFNpemU6IFtcbiAgICAgICAge1xuICAgICAgICAgIGJsb2NrU2l6ZTogZWxlbWVudC5jbGllbnRIZWlnaHQsXG4gICAgICAgICAgaW5saW5lU2l6ZTogZWxlbWVudC5jbGllbnRXaWR0aFxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgY29udGVudFJlY3Q6IHtcbiAgICAgICAgLi4uY29udGVudFJlY3QsXG4gICAgICAgIHRvSlNPTjogKCkgPT4gSlNPTi5zdHJpbmdpZnkoY29udGVudFJlY3QpXG4gICAgICB9LFxuICAgICAgZGV2aWNlUGl4ZWxDb250ZW50Qm94U2l6ZTogW1xuICAgICAgICB7XG4gICAgICAgICAgYmxvY2tTaXplOiBlbGVtZW50LmNsaWVudFdpZHRoLFxuICAgICAgICAgIGlubGluZVNpemU6IGVsZW1lbnQuY2xpZW50V2lkdGhcbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIHRhcmdldDogZWxlbWVudFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
@@ -8,7 +8,7 @@ import * as i1 from '@angular/cdk/overlay';
8
8
  import { OverlayModule, CdkConnectedOverlay } from '@angular/cdk/overlay';
9
9
  import { __decorate, __awaiter } from 'tslib';
10
10
  import * as i6 from 'rxjs';
11
- import { BehaviorSubject, Subject, combineLatest, merge, concat, fromEvent, Observable, ReplaySubject, of, timer } from 'rxjs';
11
+ import { BehaviorSubject, timer, Subject, combineLatest, merge, concat, fromEvent, Observable, ReplaySubject, of } from 'rxjs';
12
12
  import { skipWhile, map, switchMap, startWith, pairwise, filter, take, debounceTime, skip, withLatestFrom, distinctUntilChanged, takeUntil, first, delay, mapTo, tap } from 'rxjs/operators';
13
13
  import * as i1$1 from '@ngx-translate/core';
14
14
  import { TranslatePipe, TranslateModule } from '@ngx-translate/core';
@@ -518,7 +518,16 @@ function isResizeableElement(element) {
518
518
  class ResizeObserverService {
519
519
  observe(element, callback, options) {
520
520
  if (!this.resizeObserver) {
521
- this.resizeObserver = new ResizeObserver(this.resizeObserverCallback.bind(this));
521
+ try {
522
+ this.resizeObserver = new ResizeObserver(this.resizeObserverCallback.bind(this));
523
+ }
524
+ catch (_a) {
525
+ // All the browsers we support implement the ResizeObserver API.
526
+ // For unsupported browsers, there's this "one time artifical resize event".
527
+ // They will not get the functionality tied to later resize events.
528
+ timer(500).subscribe(() => callback(this.getMockOneTimeResizeEventForUnsupportedBrowsers(element)));
529
+ return;
530
+ }
522
531
  }
523
532
  element.handleResize = callback;
524
533
  this.resizeObserver.observe(element, options);
@@ -536,6 +545,42 @@ class ResizeObserverService {
536
545
  }
537
546
  });
538
547
  }
548
+ /**
549
+ * All browsers we officially support implement the ResizeObserver API.
550
+ * Still as a curtesy do customers who for some reason have older browsers
551
+ * we call the callback once with the initial dimensions of the element
552
+ * and then do not react on resize events afterwards.
553
+ * This should still make them happier than a "browser not supported" warning.
554
+ */
555
+ getMockOneTimeResizeEventForUnsupportedBrowsers(element) {
556
+ const contentRect = {
557
+ bottom: element.clientHeight,
558
+ height: element.clientHeight,
559
+ left: 0,
560
+ right: element.clientWidth,
561
+ top: 0,
562
+ width: element.clientWidth,
563
+ x: 0,
564
+ y: 0
565
+ };
566
+ return {
567
+ borderBoxSize: [{ blockSize: element.clientHeight, inlineSize: element.clientWidth }],
568
+ contentBoxSize: [
569
+ {
570
+ blockSize: element.clientHeight,
571
+ inlineSize: element.clientWidth
572
+ }
573
+ ],
574
+ contentRect: Object.assign(Object.assign({}, contentRect), { toJSON: () => JSON.stringify(contentRect) }),
575
+ devicePixelContentBoxSize: [
576
+ {
577
+ blockSize: element.clientWidth,
578
+ inlineSize: element.clientWidth
579
+ }
580
+ ],
581
+ target: element
582
+ };
583
+ }
539
584
  }
540
585
  ResizeObserverService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: ResizeObserverService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
541
586
  ResizeObserverService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: ResizeObserverService, providedIn: 'root' });
@@ -1167,72 +1212,77 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImpor
1167
1212
  class LxLinkifyPipe {
1168
1213
  transform(text) {
1169
1214
  if (text && typeof text === 'string') {
1170
- let textWithRawLinks = text;
1171
- /**
1172
- * Keeping track of this index prevents infinite loops
1173
- * where a previously processed link starts with the same characters
1174
- * as a second link.
1175
- * e.g. https://angular.io/docs followed by https://angular.io
1176
- */
1177
- let nextIndexToStartReplacingFrom = 0;
1178
- const rawLinkMatches = this.getAllRegexMatches(LxLinkifyPipe.HTTP_LINK_REGEX, text);
1179
- rawLinkMatches.forEach((rawLinkMatch) => {
1180
- const [url] = rawLinkMatch;
1181
- const wrapUrlInAnchor = (sanitizedUrlMatch) => {
1182
- const firstPart = textWithRawLinks.substring(0, nextIndexToStartReplacingFrom);
1183
- const anchorTagHtml = `<a href="${sanitizedUrlMatch}" target="_blank" rel="noopener noreferrer">${sanitizedUrlMatch}</a>`;
1184
- const secondPart = textWithRawLinks.substring(nextIndexToStartReplacingFrom).replace(sanitizedUrlMatch, anchorTagHtml);
1185
- textWithRawLinks = firstPart + secondPart;
1186
- nextIndexToStartReplacingFrom = rawLinkMatch.index + anchorTagHtml.length;
1187
- };
1188
- if (url) {
1189
- /*
1190
- * TODO: get rid of all this code once Safari supports negative lookbehinds in regular expressions
1191
- * The following is RegExp that handles the same stuff as the JS code below:
1192
- *
1193
- * /(?:(?:(?<!\]\())(?:https|http):\/\/)(?:[^\s/$.?#][^\s]*(?<![\.)]))/gi;
1194
- *
1195
- * Demo on regex101: https://regex101.com/r/7Vl9bg/1
1196
- *
1197
- * Check lookbehind support here: https://caniuse.com/?search=lookbehind
1198
- */
1199
- const lastUrlCharacterIndex = rawLinkMatch.index + url.length - 1;
1200
- const textUsedToPerformMatching = rawLinkMatch.input;
1201
- const lastCharacterInUrl = textUsedToPerformMatching[lastUrlCharacterIndex];
1202
- if (lastCharacterInUrl === '.') {
1203
- const characterAfterUrl = textUsedToPerformMatching[lastUrlCharacterIndex + 1];
1204
- if (!characterAfterUrl || characterAfterUrl === ' ' || characterAfterUrl === '\n') {
1205
- const urlWithoutDotAtTheEnd = url.slice(0, -1);
1206
- wrapUrlInAnchor(urlWithoutDotAtTheEnd);
1207
- }
1208
- }
1209
- else if (rawLinkMatch.index > 3) {
1210
- const twoCharactersInFrontOfTheLink = `${textUsedToPerformMatching[rawLinkMatch.index - 2]}${textUsedToPerformMatching[rawLinkMatch.index - 1]}`;
1211
- if (twoCharactersInFrontOfTheLink && twoCharactersInFrontOfTheLink !== '](') {
1212
- // only wrap url in anchor when it is not a named markdown link
1213
- wrapUrlInAnchor(url);
1214
- }
1215
- }
1216
- else {
1217
- wrapUrlInAnchor(url);
1218
- }
1219
- }
1220
- });
1221
- let textWithRawAndNamedLinks = textWithRawLinks;
1222
- const namedLinkMatches = this.getAllRegexMatches(LxLinkifyPipe.NAMED_LINK_REGEX, textWithRawLinks);
1223
- namedLinkMatches.forEach((namedLinkMatch) => {
1224
- const [source, name, url] = namedLinkMatch;
1225
- const urlIsValid = url && !/javascript\:/i.test(url);
1226
- if (source && name && urlIsValid) {
1227
- textWithRawAndNamedLinks = textWithRawAndNamedLinks.replace(source, `<a href="${url}" target="_blank" rel="noopener noreferrer">${name}</a>`);
1228
- }
1229
- });
1215
+ const textWithRawLinks = this.wrapRawHttpLinksWithAnchorTags(text);
1216
+ const textWithRawAndNamedLinks = this.turnMarkdownStyleLinksIntoAnchorTags(textWithRawLinks);
1230
1217
  return textWithRawAndNamedLinks;
1231
1218
  }
1232
1219
  else {
1233
1220
  return text;
1234
1221
  }
1235
1222
  }
1223
+ turnMarkdownStyleLinksIntoAnchorTags(text) {
1224
+ let textWithRawAndNamedLinks = text;
1225
+ const namedLinkMatches = this.getAllRegexMatches(LxLinkifyPipe.NAMED_LINK_REGEX, text);
1226
+ namedLinkMatches.forEach((namedLinkMatch) => {
1227
+ const [source, name, url] = namedLinkMatch;
1228
+ const urlIsValid = url && !/javascript\:/i.test(url);
1229
+ if (source && name && urlIsValid) {
1230
+ textWithRawAndNamedLinks = textWithRawAndNamedLinks.replace(source, `<a href="${url}" target="_blank" rel="noopener noreferrer">${name}</a>`);
1231
+ }
1232
+ });
1233
+ return textWithRawAndNamedLinks;
1234
+ }
1235
+ wrapRawHttpLinksWithAnchorTags(text) {
1236
+ let textWithRawLinks = text;
1237
+ /**
1238
+ * Keeping track of this index prevents infinite loops
1239
+ * where a previously processed link starts with the same characters
1240
+ * as a second link.
1241
+ * e.g. https://angular.io/docs followed by https://angular.io
1242
+ */
1243
+ let nextIndexToStartReplacingFrom = 0;
1244
+ const rawLinkMatches = this.getAllRegexMatches(LxLinkifyPipe.HTTP_LINK_REGEX, text);
1245
+ rawLinkMatches.forEach((rawLinkMatch) => {
1246
+ const [url] = rawLinkMatch;
1247
+ const wrapUrlInAnchor = (sanitizedUrlMatch) => {
1248
+ const firstPart = textWithRawLinks.substring(0, nextIndexToStartReplacingFrom);
1249
+ const anchorTagHtml = `<a href="${sanitizedUrlMatch}" target="_blank" rel="noopener noreferrer">${sanitizedUrlMatch}</a>`;
1250
+ const secondPart = textWithRawLinks.substring(nextIndexToStartReplacingFrom).replace(sanitizedUrlMatch, anchorTagHtml);
1251
+ textWithRawLinks = firstPart + secondPart;
1252
+ nextIndexToStartReplacingFrom = rawLinkMatch.index + anchorTagHtml.length;
1253
+ };
1254
+ if (url) {
1255
+ /*
1256
+ * TODO: get rid of all this code once Safari supports negative lookbehinds in regular expressions
1257
+ * The following is RegExp that handles the same stuff as the JS code below:
1258
+ *
1259
+ * /(?:(?:(?<!\]\())(?:https|http):\/\/)(?:[^\s/$.?#][^\s]*(?<![\.)]))/gi;
1260
+ *
1261
+ * Demo on regex101: https://regex101.com/r/7Vl9bg/1
1262
+ *
1263
+ * Check lookbehind support here: https://caniuse.com/?search=lookbehind
1264
+ */
1265
+ const lastUrlCharacterIndex = rawLinkMatch.index + url.length - 1;
1266
+ const textUsedToPerformMatching = rawLinkMatch.input;
1267
+ const lastCharacterInUrl = textUsedToPerformMatching[lastUrlCharacterIndex];
1268
+ const twoCharactersInFrontOfTheLink = rawLinkMatch.index > 3
1269
+ ? `${textUsedToPerformMatching[rawLinkMatch.index - 2]}${textUsedToPerformMatching[rawLinkMatch.index - 1]}`
1270
+ : '';
1271
+ const isMarkdownSyntaxLink = twoCharactersInFrontOfTheLink === '](';
1272
+ if (!isMarkdownSyntaxLink && lastCharacterInUrl === '.') {
1273
+ const characterAfterUrl = textUsedToPerformMatching[lastUrlCharacterIndex + 1];
1274
+ if (!characterAfterUrl || characterAfterUrl === ' ' || characterAfterUrl === '\n') {
1275
+ const urlWithoutDotAtTheEnd = url.slice(0, -1);
1276
+ wrapUrlInAnchor(urlWithoutDotAtTheEnd);
1277
+ }
1278
+ }
1279
+ else if (!isMarkdownSyntaxLink) {
1280
+ wrapUrlInAnchor(url);
1281
+ }
1282
+ }
1283
+ });
1284
+ return textWithRawLinks;
1285
+ }
1236
1286
  getAllRegexMatches(regex, input) {
1237
1287
  let match;
1238
1288
  const matches = [];