Completed
Push — master ( 0528ed...3f7b24 )
by cam
01:54
created
ecrire/tests/Filtre/ProtegerAmpTest.php 1 patch
Indentation   +40 added lines, -40 removed lines patch added patch discarded remove patch
@@ -13,46 +13,46 @@
 block discarded – undo
13 13
 
14 14
 class ProtegerAmpTest extends TestCase
15 15
 {
16
-	public static function setUpBeforeClass(): void {
17
-		find_in_path('inc/filtres.php', '', true);
18
-	}
16
+    public static function setUpBeforeClass(): void {
17
+        find_in_path('inc/filtres.php', '', true);
18
+    }
19 19
 
20
-	#[DataProvider('providerFiltresProtegerAmp')]
21
-	public function testFiltresProtegerAmp($expected, ...$args): void {
22
-		$actual = proteger_amp(...$args);
23
-		$this->assertSame($expected, $actual);
24
-	}
20
+    #[DataProvider('providerFiltresProtegerAmp')]
21
+    public function testFiltresProtegerAmp($expected, ...$args): void {
22
+        $actual = proteger_amp(...$args);
23
+        $this->assertSame($expected, $actual);
24
+    }
25 25
 
26
-	public static function providerFiltresProtegerAmp(): array {
27
-		return [
28
-			0 => [
29
-				0 => '',
30
-				1 => '',
31
-			],
32
-			1 => [
33
-				0 => '0',
34
-				1 => '0',
35
-			],
36
-			2 => [
37
-				0 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->http://www.spip.net] http://www.spip.net',
38
-				1 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->http://www.spip.net] http://www.spip.net',
39
-			],
40
-			3 => [
41
-				0 => 'Un texte avec des entit&amp;eacute;s &amp;amp;&amp;lt;&amp;gt;&amp;quot;',
42
-				1 => 'Un texte avec des entit&eacute;s &amp;&lt;&gt;&quot;',
43
-			],
44
-			4 => [
45
-				0 => 'Un texte sans entites &amp;<>"\'',
46
-				1 => 'Un texte sans entites &<>"\'',
47
-			],
48
-			5 => [
49
-				0 => '{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>',
50
-				1 => '{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>',
51
-			],
52
-			6 => [
53
-				0 => 'Un modele <modeleinexistant|lien=[->http://www.spip.net]>',
54
-				1 => 'Un modele <modeleinexistant|lien=[->http://www.spip.net]>',
55
-			],
56
-		];
57
-	}
26
+    public static function providerFiltresProtegerAmp(): array {
27
+        return [
28
+            0 => [
29
+                0 => '',
30
+                1 => '',
31
+            ],
32
+            1 => [
33
+                0 => '0',
34
+                1 => '0',
35
+            ],
36
+            2 => [
37
+                0 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->http://www.spip.net] http://www.spip.net',
38
+                1 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->http://www.spip.net] http://www.spip.net',
39
+            ],
40
+            3 => [
41
+                0 => 'Un texte avec des entit&amp;eacute;s &amp;amp;&amp;lt;&amp;gt;&amp;quot;',
42
+                1 => 'Un texte avec des entit&eacute;s &amp;&lt;&gt;&quot;',
43
+            ],
44
+            4 => [
45
+                0 => 'Un texte sans entites &amp;<>"\'',
46
+                1 => 'Un texte sans entites &<>"\'',
47
+            ],
48
+            5 => [
49
+                0 => '{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>',
50
+                1 => '{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>',
51
+            ],
52
+            6 => [
53
+                0 => 'Un modele <modeleinexistant|lien=[->http://www.spip.net]>',
54
+                1 => 'Un modele <modeleinexistant|lien=[->http://www.spip.net]>',
55
+            ],
56
+        ];
57
+    }
58 58
 }
Please login to merge, or discard this patch.
ecrire/tests/Filtre/AttributHtmlTest.php 2 patches
Indentation   +24 added lines, -24 removed lines patch added patch discarded remove patch
@@ -13,30 +13,30 @@
 block discarded – undo
13 13
 
14 14
 class AttributHtmlTest extends TestCase
15 15
 {
16
-	public static function setUpBeforeClass(): void {
17
-		find_in_path('./inc/filtres.php', '', true);
18
-	}
16
+    public static function setUpBeforeClass(): void {
17
+        find_in_path('./inc/filtres.php', '', true);
18
+    }
19 19
 
20
-	#[DataProvider('providerAttributHtml')]
21
-	public function testAttributHtml($expected, $texte): void {
22
-		$actual = attribut_html($texte);
23
-		$this->assertSame($expected, $actual);
24
-	}
20
+    #[DataProvider('providerAttributHtml')]
21
+    public function testAttributHtml($expected, $texte): void {
22
+        $actual = attribut_html($texte);
23
+        $this->assertSame($expected, $actual);
24
+    }
25 25
 
26
-	public static function providerAttributHtml(): array {
27
-		return [
28
-			0 => [
29
-				'expected' => 'aujourd&#039;hui &gt; &#034;30&#034; &rarr; 50',
30
-				'texte' => 'aujourd\'hui > "30" &rarr; <a href=\'http://www.spip.net\'>50</a>',
31
-			],
32
-			1 => [
33
-				'expected' => 'L&#039;histoire &#039;tr&#232;s&#039; &#034;folle&#034; des m&#233;tas en iitalik',
34
-				'texte' => 'L\'histoire \'tr&egrave;s\' "folle" <strong>des</strong>&nbsp;m&eacute;tas<p>en <em>ii</em>talik</p>',
35
-			],
36
-			2 => [
37
-				'expected' => 'allons &#224; la mer',
38
-				'texte' => 'allons ' . chr(195) . chr(160) . ' la mer', // le a` risque de matcher \s
39
-			],
40
-		];
41
-	}
26
+    public static function providerAttributHtml(): array {
27
+        return [
28
+            0 => [
29
+                'expected' => 'aujourd&#039;hui &gt; &#034;30&#034; &rarr; 50',
30
+                'texte' => 'aujourd\'hui > "30" &rarr; <a href=\'http://www.spip.net\'>50</a>',
31
+            ],
32
+            1 => [
33
+                'expected' => 'L&#039;histoire &#039;tr&#232;s&#039; &#034;folle&#034; des m&#233;tas en iitalik',
34
+                'texte' => 'L\'histoire \'tr&egrave;s\' "folle" <strong>des</strong>&nbsp;m&eacute;tas<p>en <em>ii</em>talik</p>',
35
+            ],
36
+            2 => [
37
+                'expected' => 'allons &#224; la mer',
38
+                'texte' => 'allons ' . chr(195) . chr(160) . ' la mer', // le a` risque de matcher \s
39
+            ],
40
+        ];
41
+    }
42 42
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -35,7 +35,7 @@
 block discarded – undo
35 35
 			],
36 36
 			2 => [
37 37
 				'expected' => 'allons &#224; la mer',
38
-				'texte' => 'allons ' . chr(195) . chr(160) . ' la mer', // le a` risque de matcher \s
38
+				'texte' => 'allons '.chr(195).chr(160).' la mer', // le a` risque de matcher \s
39 39
 			],
40 40
 		];
41 41
 	}
Please login to merge, or discard this patch.
ecrire/tests/Filtre/CorrigerEntitesHtmlTest.php 1 patch
Indentation   +56 added lines, -56 removed lines patch added patch discarded remove patch
@@ -13,68 +13,68 @@
 block discarded – undo
13 13
 
14 14
 class CorrigerEntitesHtmlTest extends TestCase
15 15
 {
16
-	public static function setUpBeforeClass(): void {
17
-		find_in_path('./inc/filtres.php', '', true);
18
-	}
16
+    public static function setUpBeforeClass(): void {
17
+        find_in_path('./inc/filtres.php', '', true);
18
+    }
19 19
 
20
-	#[DataProvider('providerFiltresCorrigerEntitesHtml')]
21
-	public function testFiltresCorrigerEntitesHtml($expected, ...$args): void {
22
-		$actual = corriger_entites_html(...$args);
23
-		$this->assertSame($expected, $actual);
24
-	}
20
+    #[DataProvider('providerFiltresCorrigerEntitesHtml')]
21
+    public function testFiltresCorrigerEntitesHtml($expected, ...$args): void {
22
+        $actual = corriger_entites_html(...$args);
23
+        $this->assertSame($expected, $actual);
24
+    }
25 25
 
26
-	public static function providerFiltresCorrigerEntitesHtml(): array {
27
-		return [
28
-			0 => [
29
-				0 => '',
30
-				1 => '',
31
-			],
32
-			1 => [
33
-				0 => '0',
34
-				1 => '0',
35
-			],
36
-			2 => [
37
-				0 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->http://www.spip.net] http://www.spip.net',
38
-				1 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->http://www.spip.net] http://www.spip.net',
39
-			],
40
-			3 => [
41
-				0 => 'Un texte avec des entit&eacute;s &amp;&lt;&gt;&quot;',
42
-				1 => 'Un texte avec des entit&eacute;s &amp;&lt;&gt;&quot;',
43
-			],
44
-			4 => [
45
-				0 => 'Un texte avec des entit&amp;eacute;s echap&amp;eacute; &amp;&amp;lt;&amp;gt;&amp;quot;',
46
-				1 => 'Un texte avec des entit&amp;eacute;s echap&amp;eacute; &amp;amp;&amp;lt;&amp;gt;&amp;quot;',
47
-			],
48
-			5 => [
49
-				0 => 'Un texte avec des entit&#233;s num&#233;riques &#38;&#60;&#62;&quot;',
50
-				1 => 'Un texte avec des entit&#233;s num&#233;riques &#38;&#60;&#62;&quot;',
51
-			],
52
-			6 => [
53
-				0 => 'Un texte avec des entit&#233;s num&#233;riques echap&#233;es &amp;#38;&amp;#60;&amp;#62;&amp;quot;',
54
-				1 => 'Un texte avec des entit&amp;#233;s num&amp;#233;riques echap&amp;#233;es &amp;#38;&amp;#60;&amp;#62;&amp;quot;',
55
-			],
56
-			7 => [
57
-				0 => 'Un texte sans entites &<>"\'',
58
-				1 => 'Un texte sans entites &<>"\'',
59
-			],
60
-			8 => [
61
-				0 => '{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>',
62
-				1 => '{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>',
63
-			],
64
-			9 => [
65
-				0 => 'Un modele <modeleinexistant|lien=[->http://www.spip.net]>',
66
-				1 => 'Un modele <modeleinexistant|lien=[->http://www.spip.net]>',
67
-			],
68
-			10 => [
69
-				0 => 'Un texte avec des retour
26
+    public static function providerFiltresCorrigerEntitesHtml(): array {
27
+        return [
28
+            0 => [
29
+                0 => '',
30
+                1 => '',
31
+            ],
32
+            1 => [
33
+                0 => '0',
34
+                1 => '0',
35
+            ],
36
+            2 => [
37
+                0 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->http://www.spip.net] http://www.spip.net',
38
+                1 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->http://www.spip.net] http://www.spip.net',
39
+            ],
40
+            3 => [
41
+                0 => 'Un texte avec des entit&eacute;s &amp;&lt;&gt;&quot;',
42
+                1 => 'Un texte avec des entit&eacute;s &amp;&lt;&gt;&quot;',
43
+            ],
44
+            4 => [
45
+                0 => 'Un texte avec des entit&amp;eacute;s echap&amp;eacute; &amp;&amp;lt;&amp;gt;&amp;quot;',
46
+                1 => 'Un texte avec des entit&amp;eacute;s echap&amp;eacute; &amp;amp;&amp;lt;&amp;gt;&amp;quot;',
47
+            ],
48
+            5 => [
49
+                0 => 'Un texte avec des entit&#233;s num&#233;riques &#38;&#60;&#62;&quot;',
50
+                1 => 'Un texte avec des entit&#233;s num&#233;riques &#38;&#60;&#62;&quot;',
51
+            ],
52
+            6 => [
53
+                0 => 'Un texte avec des entit&#233;s num&#233;riques echap&#233;es &amp;#38;&amp;#60;&amp;#62;&amp;quot;',
54
+                1 => 'Un texte avec des entit&amp;#233;s num&amp;#233;riques echap&amp;#233;es &amp;#38;&amp;#60;&amp;#62;&amp;quot;',
55
+            ],
56
+            7 => [
57
+                0 => 'Un texte sans entites &<>"\'',
58
+                1 => 'Un texte sans entites &<>"\'',
59
+            ],
60
+            8 => [
61
+                0 => '{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>',
62
+                1 => '{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>',
63
+            ],
64
+            9 => [
65
+                0 => 'Un modele <modeleinexistant|lien=[->http://www.spip.net]>',
66
+                1 => 'Un modele <modeleinexistant|lien=[->http://www.spip.net]>',
67
+            ],
68
+            10 => [
69
+                0 => 'Un texte avec des retour
70 70
 a la ligne et meme des
71 71
 
72 72
 paragraphes',
73
-				1 => 'Un texte avec des retour
73
+                1 => 'Un texte avec des retour
74 74
 a la ligne et meme des
75 75
 
76 76
 paragraphes',
77
-			],
78
-		];
79
-	}
77
+            ],
78
+        ];
79
+    }
80 80
 }
Please login to merge, or discard this patch.
ecrire/tests/Filtre/ExtraireAttributTest.php 1 patch
Indentation   +197 added lines, -197 removed lines patch added patch discarded remove patch
@@ -9,214 +9,214 @@
 block discarded – undo
9 9
 
10 10
 class ExtraireAttributTest extends TestCase
11 11
 {
12
-	public static function setUpBeforeClass(): void {
13
-		find_in_path('inc/filtres.php', '', true);
14
-	}
12
+    public static function setUpBeforeClass(): void {
13
+        find_in_path('inc/filtres.php', '', true);
14
+    }
15 15
 
16
-	#[DataProvider('providerExtraireAttribut')]
17
-	public function testExtraireAttribut($expected, ...$args): void {
18
-		$actual = extraire_attribut(...$args);
19
-		$this->assertSame($expected, $actual);
20
-	}
16
+    #[DataProvider('providerExtraireAttribut')]
17
+    public function testExtraireAttribut($expected, ...$args): void {
18
+        $actual = extraire_attribut(...$args);
19
+        $this->assertSame($expected, $actual);
20
+    }
21 21
 
22
-	public static function providerExtraireAttribut(): array {
23
-		find_in_path('inc/filtres.php', '', true);
24
-		return [
25
-			'img-src' => [
26
-				'expected' => 'sha\'dok',
27
-				'balise' => '<img src="sha\'dok" width="10" height=100 />',
28
-				'attribut' => 'src',
29
-			],
30
-			'img-width' => [
31
-				'expected' => '10',
32
-				'balise' => '<img src="sha\'dok" width="10" height=100 />',
33
-				'attribut' => 'width',
34
-			],
35
-			'img-height' => [
36
-				'expected' => '100',
37
-				'balise' => '<img src="sha\'dok" width="10" height=100 />',
38
-				'attribut' => 'height',
39
-			],
40
-			'img-entites' => [
41
-				'expected' => '"&#38;\'',
42
-				'balise' => inserer_attribut('<img width=10>', 'src', '"&\''),
43
-				'attribut' => 'src',
44
-			],
45
-			'img-entites-width' => [
46
-				'expected' => '10',
47
-				'balise' => inserer_attribut('<img width=10>', 'src', '"&\''),
48
-				'attribut' => 'width',
49
-			],
50
-			// Dans les crayons on s'etait fait avoir par un titre
51
-			// qui valait "<span class="color:xxx;">Titre</span>
52
-			// et que inserer_attribut detruisait en inserant a tort
53
-			// le style='width:560px' dans l'attribut value="" du <input/>
54
-			// (bon je sais c'est pas clair)
55
-			'attribut imbrique' => [
56
-				'expected' => '<span style="color:red;">ho</span>',
57
-				'balise' => inserer_attribut(
58
-					inserer_attribut('<input />', 'value', '<span style="color:red;">ho</span>'),
59
-					'style',
60
-					'width: 120px;'
61
-				),
62
-				'attribut' => 'value',
63
-			],
64
-			// attribut autodefini
65
-			'attribut autodefini #1' => [
66
-				'expected' => 'checked',
67
-				'balise' => '<input checked />',
68
-				'attribut' => 'checked',
69
-			],
70
-			'attribut autodefini #2' => [
71
-				'expected' => 'checked',
72
-				'balise' => '<input checked/>',
73
-				'attribut' => 'checked',
74
-			],
75
-			'attribut autodefini #3' => [
76
-				'expected' => 'checked',
77
-				'balise' => '<input checked>',
78
-				'attribut' => 'checked',
79
-			],
80
-			// inserer un attribut deja existant
81
-			'remplacement attribut' => [
82
-				'expected' => 'b',
83
-				'balise' => inserer_attribut('<img src="a" width=12>', 'src', 'b'),
84
-				'attribut' => 'src',
85
-			],
86
-			// Ne pas confondre "", "0" et attribut autodefini
87
-			'title=\'\'' => [
88
-				'expected' => '',
89
-				'balise' => '<a title=\'\'>',
90
-				'attribut' => 'title',
91
-			],
92
-			'title=""' => [
93
-				'expected' => '',
94
-				'balise' => '<a title="">',
95
-				'attribut' => 'title',
96
-			],
97
-			'width=0' => [
98
-				'expected' => '0',
99
-				'balise' => '<img width=0>',
100
-				'attribut' => 'width',
101
-			],
102
-			'width=\'0\'' => [
103
-				'expected' => '0',
104
-				'balise' => '<img width=\'0\'>',
105
-				'attribut' => 'width',
106
-			],
107
-			'width="0"' => [
108
-				'expected' => '0',
109
-				'balise' => '<img width="0">',
110
-				'attribut' => 'width',
111
-			],
112
-			// extraire un attribut d'une balise xml:truc :
113
-			'xml:deuxpoints' => [
114
-				'expected' => 'a',
115
-				'balise' => '<chose:truc machin=\'a\'/>',
116
-				'attribut' => 'machin',
117
-			],
118
-			// manipuler des listes de balises
119
-			'liste' => [
120
-				'expected' => ['a', 'b'],
121
-				'balise' => ['<chose machin="a"/>', '<chose machin="b"/>'],
122
-				'attribut' => 'machin',
123
-			],
124
-			// ne pas confondre d’attribut
125
-			'nom attribut partiel #1' => [
126
-				'expected' => null,
127
-				'balise' => '<img mysrc="test">',
128
-				'attribut' => 'src',
129
-			],
130
-			'nom attribut partiel #2' => [
131
-				'expected' => null,
132
-				'balise' => '<img src-alt="test">',
133
-				'attribut' => 'src',
134
-			],
135
-			'nom attribut partiel #3' => [
136
-				'expected' => null,
137
-				'balise' => '<img data-src="test">',
138
-				'attribut' => 'src',
139
-			],
140
-			// Attrapper un attribut d'un tag interne (oui oui)...
141
-			'extraction tag interne' => [
142
-				'expected' => 'image',
143
-				'balise' => '<a href="url"><img src="image" /></a>',
144
-				'attribut' => 'src',
145
-			],
146
-			// autoriser les points et tirets dans les attributs
147
-			'points et tirets #1' => [
148
-				'expected' => '1',
149
-				'balise' => '<bidule chose.truc="yo" machin-lol="ouais" toto="1" />',
150
-				'attribut' => 'toto',
151
-			],
152
-			'points et tirets #2' => [
153
-				'expected' => 'yo',
154
-				'balise' => '<bidule chose.truc="yo" machin-lol="ouais" toto="1" />',
155
-				'attribut' => 'chose.truc',
156
-			],
157
-			'points et tirets #3' => [
158
-				'expected' => 'ouais',
159
-				'balise' => '<bidule chose.truc="yo" machin-lol="ouais" toto="1" />',
160
-				'attribut' => 'machin-lol',
161
-			],
162
-			'tirets et pas tirets #1' => [
163
-				'expected' => 'a',
164
-				'balise' => '<bidule toto-a="a" toto="1" toto-b="b" />',
165
-				'attribut' => 'toto-a',
166
-			],
167
-			'tirets et pas tirets #2' => [
168
-				'expected' => 'b',
169
-				'balise' => '<bidule toto-a="a" toto="1" toto-b="b" />',
170
-				'attribut' => 'toto-b',
171
-			],
172
-			'tirets et pas tirets #3' => [
173
-				'expected' => '1',
174
-				'balise' => '<bidule toto-a="a" toto="1" toto-b="b" />',
175
-				'attribut' => 'toto',
176
-			],
177
-		];
178
-	}
22
+    public static function providerExtraireAttribut(): array {
23
+        find_in_path('inc/filtres.php', '', true);
24
+        return [
25
+            'img-src' => [
26
+                'expected' => 'sha\'dok',
27
+                'balise' => '<img src="sha\'dok" width="10" height=100 />',
28
+                'attribut' => 'src',
29
+            ],
30
+            'img-width' => [
31
+                'expected' => '10',
32
+                'balise' => '<img src="sha\'dok" width="10" height=100 />',
33
+                'attribut' => 'width',
34
+            ],
35
+            'img-height' => [
36
+                'expected' => '100',
37
+                'balise' => '<img src="sha\'dok" width="10" height=100 />',
38
+                'attribut' => 'height',
39
+            ],
40
+            'img-entites' => [
41
+                'expected' => '"&#38;\'',
42
+                'balise' => inserer_attribut('<img width=10>', 'src', '"&\''),
43
+                'attribut' => 'src',
44
+            ],
45
+            'img-entites-width' => [
46
+                'expected' => '10',
47
+                'balise' => inserer_attribut('<img width=10>', 'src', '"&\''),
48
+                'attribut' => 'width',
49
+            ],
50
+            // Dans les crayons on s'etait fait avoir par un titre
51
+            // qui valait "<span class="color:xxx;">Titre</span>
52
+            // et que inserer_attribut detruisait en inserant a tort
53
+            // le style='width:560px' dans l'attribut value="" du <input/>
54
+            // (bon je sais c'est pas clair)
55
+            'attribut imbrique' => [
56
+                'expected' => '<span style="color:red;">ho</span>',
57
+                'balise' => inserer_attribut(
58
+                    inserer_attribut('<input />', 'value', '<span style="color:red;">ho</span>'),
59
+                    'style',
60
+                    'width: 120px;'
61
+                ),
62
+                'attribut' => 'value',
63
+            ],
64
+            // attribut autodefini
65
+            'attribut autodefini #1' => [
66
+                'expected' => 'checked',
67
+                'balise' => '<input checked />',
68
+                'attribut' => 'checked',
69
+            ],
70
+            'attribut autodefini #2' => [
71
+                'expected' => 'checked',
72
+                'balise' => '<input checked/>',
73
+                'attribut' => 'checked',
74
+            ],
75
+            'attribut autodefini #3' => [
76
+                'expected' => 'checked',
77
+                'balise' => '<input checked>',
78
+                'attribut' => 'checked',
79
+            ],
80
+            // inserer un attribut deja existant
81
+            'remplacement attribut' => [
82
+                'expected' => 'b',
83
+                'balise' => inserer_attribut('<img src="a" width=12>', 'src', 'b'),
84
+                'attribut' => 'src',
85
+            ],
86
+            // Ne pas confondre "", "0" et attribut autodefini
87
+            'title=\'\'' => [
88
+                'expected' => '',
89
+                'balise' => '<a title=\'\'>',
90
+                'attribut' => 'title',
91
+            ],
92
+            'title=""' => [
93
+                'expected' => '',
94
+                'balise' => '<a title="">',
95
+                'attribut' => 'title',
96
+            ],
97
+            'width=0' => [
98
+                'expected' => '0',
99
+                'balise' => '<img width=0>',
100
+                'attribut' => 'width',
101
+            ],
102
+            'width=\'0\'' => [
103
+                'expected' => '0',
104
+                'balise' => '<img width=\'0\'>',
105
+                'attribut' => 'width',
106
+            ],
107
+            'width="0"' => [
108
+                'expected' => '0',
109
+                'balise' => '<img width="0">',
110
+                'attribut' => 'width',
111
+            ],
112
+            // extraire un attribut d'une balise xml:truc :
113
+            'xml:deuxpoints' => [
114
+                'expected' => 'a',
115
+                'balise' => '<chose:truc machin=\'a\'/>',
116
+                'attribut' => 'machin',
117
+            ],
118
+            // manipuler des listes de balises
119
+            'liste' => [
120
+                'expected' => ['a', 'b'],
121
+                'balise' => ['<chose machin="a"/>', '<chose machin="b"/>'],
122
+                'attribut' => 'machin',
123
+            ],
124
+            // ne pas confondre d’attribut
125
+            'nom attribut partiel #1' => [
126
+                'expected' => null,
127
+                'balise' => '<img mysrc="test">',
128
+                'attribut' => 'src',
129
+            ],
130
+            'nom attribut partiel #2' => [
131
+                'expected' => null,
132
+                'balise' => '<img src-alt="test">',
133
+                'attribut' => 'src',
134
+            ],
135
+            'nom attribut partiel #3' => [
136
+                'expected' => null,
137
+                'balise' => '<img data-src="test">',
138
+                'attribut' => 'src',
139
+            ],
140
+            // Attrapper un attribut d'un tag interne (oui oui)...
141
+            'extraction tag interne' => [
142
+                'expected' => 'image',
143
+                'balise' => '<a href="url"><img src="image" /></a>',
144
+                'attribut' => 'src',
145
+            ],
146
+            // autoriser les points et tirets dans les attributs
147
+            'points et tirets #1' => [
148
+                'expected' => '1',
149
+                'balise' => '<bidule chose.truc="yo" machin-lol="ouais" toto="1" />',
150
+                'attribut' => 'toto',
151
+            ],
152
+            'points et tirets #2' => [
153
+                'expected' => 'yo',
154
+                'balise' => '<bidule chose.truc="yo" machin-lol="ouais" toto="1" />',
155
+                'attribut' => 'chose.truc',
156
+            ],
157
+            'points et tirets #3' => [
158
+                'expected' => 'ouais',
159
+                'balise' => '<bidule chose.truc="yo" machin-lol="ouais" toto="1" />',
160
+                'attribut' => 'machin-lol',
161
+            ],
162
+            'tirets et pas tirets #1' => [
163
+                'expected' => 'a',
164
+                'balise' => '<bidule toto-a="a" toto="1" toto-b="b" />',
165
+                'attribut' => 'toto-a',
166
+            ],
167
+            'tirets et pas tirets #2' => [
168
+                'expected' => 'b',
169
+                'balise' => '<bidule toto-a="a" toto="1" toto-b="b" />',
170
+                'attribut' => 'toto-b',
171
+            ],
172
+            'tirets et pas tirets #3' => [
173
+                'expected' => '1',
174
+                'balise' => '<bidule toto-a="a" toto="1" toto-b="b" />',
175
+                'attribut' => 'toto',
176
+            ],
177
+        ];
178
+    }
179 179
 
180
-	public function testExtraireAttributSpecial() {
181
-		$this->assertStringNotContainsString(
182
-			'x',
183
-			inserer_attribut('<a><img src="x"/></a>', 'src', 'y'),
184
-			'erreur remplacement tag interne'
185
-		);
180
+    public function testExtraireAttributSpecial() {
181
+        $this->assertStringNotContainsString(
182
+            'x',
183
+            inserer_attribut('<a><img src="x"/></a>', 'src', 'y'),
184
+            'erreur remplacement tag interne'
185
+        );
186 186
 
187
-		$balise = <<<HTML
187
+        $balise = <<<HTML
188 188
 			<img
189 189
 				src='sites/sunny/local/cache-gd2/648a4f8c1b5f8885415bc80228800d87.png'
190 190
 				width='96' height='96' style='height:96px;width:96px;'
191 191
 				class='format_png' />
192 192
 			HTML;
193
-		$this->assertSame(
194
-			'sites/sunny/local/cache-gd2/648a4f8c1b5f8885415bc80228800d87.png',
195
-			extraire_attribut($balise, 'src'),
196
-			'Une image + src parfois ca casse, va comprendre'
197
-		);
198
-	}
193
+        $this->assertSame(
194
+            'sites/sunny/local/cache-gd2/648a4f8c1b5f8885415bc80228800d87.png',
195
+            extraire_attribut($balise, 'src'),
196
+            'Une image + src parfois ca casse, va comprendre'
197
+        );
198
+    }
199 199
 
200 200
 
201
-	#[DataProvider('providerBase64')]
202
-	public function testBase64($expected, ...$args): void {
203
-		$actual = extraire_attribut(...$args);
204
-		$this->assertSame($expected, $actual);
205
-	}
201
+    #[DataProvider('providerBase64')]
202
+    public function testBase64($expected, ...$args): void {
203
+        $actual = extraire_attribut(...$args);
204
+        $this->assertSame($expected, $actual);
205
+    }
206 206
 
207
-	public static function providerBase64(): array {
208
-		return [
209
-			'base64 #1' => [
210
-				'expected' => 'PGEgbmFtZT0nZm9ybTEnPjwvYT4KPGRpdiBjbGFzcz0nc3BpcF9mb3Jtcyc+Cgo8ZGl2IGNsYXNzPSdzcGlwX2Rlc2NyaXB0aWYnPjwvZGl2PgoKCgoKIAoJIAoJPGZvcm0gbWV0aG9kPSdwb3N0JyBhY3Rpb249J0NvbnRhY3QuaHRtbCNmb3JtMScKCQllbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KCQkKCQk8ZGl2PgoJCQoJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2Fqb3V0X3JlcG9uc2UnIHZhbHVlPScxJyAvPgoJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2lkX2Rvbm5lZScgdmFsdWU9Jy0xMCcgLz4KCQkKCQk8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdyZXRvdXJfZm9ybScgdmFsdWU9JycgLz4KCQkKCQk8L2Rpdj4KCQkJCgoKIAoJIAoJCQoJCSA8ZmllbGRzZXQ+PGxlZ2VuZD5Ob3VzIGNvbnRhY3RlcjwvbGVnZW5kPiAKCQoJIAoJCTxkaXYgY2xhc3M9J3NwaXBfZm9ybV9jaGFtcCBsaWduZV8xJz4KCQkJCgkJCSAKCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWwnPgoJCQkJCSA8bGFiZWwgZm9yPSJpbnB1dC0xLWxpZ25lXzEiPlZvdHJlIE5vbTwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCSAKCQkJCQoJCQkJPGlucHV0IHR5cGU9InRleHRlIiBuYW1lPSdsaWduZV8xJyBpZD0naW5wdXQtMS1saWduZV8xJyB2YWx1ZT0iIiAKCQkJCQkJY2xhc3M9JyAgbGlnbmUgZm9ybWwnIAoJCQkJCQlzaXplPSc0MCcgLz4KCQkJCQoJCQkJCgkJCQkKCQkJCTxzcGFuIGNsYXNzPSduZXR0b3lldXInPiA8L3NwYW4+CgkJCQoJCTwvZGl2PgoJCgoKCiAKCSAKCQkKCQkKCQoJIAoJCTxkaXYgY2xhc3M9J3NwaXBfZm9ybV9jaGFtcCBsaWduZV8yJz4KCQkJCgkJCSAKCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWwnPgoJCQkJCSA8bGFiZWwgZm9yPSJpbnB1dC0xLWxpZ25lXzIiPlZvdHJlIFByw6lub208L2xhYmVsPgoJCQkJCQoJCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWxfb2JsaWdhdG9pcmUnPgoJCQkJCQlbT2JsaWdhdG9pcmVdPC9zcGFuPgoJCQkJCToKCQkJCTwvc3Bhbj4KCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgCgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0ZSIgbmFtZT0nbGlnbmVfMicgaWQ9J2lucHV0LTEtbGlnbmVfMicgdmFsdWU9IiIgCgkJCQkJCWNsYXNzPScgIGxpZ25lIGZvcm1sJyAKCQkJCQkJc2l6ZT0nNDAnIC8+CgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgZW1haWxfMSc+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS1lbWFpbF8xIj5Wb3RyZSBlbWFpbDwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsX2RldGFpbHMnPlZldWlsbGV6IGVudHJlciB1bmUgYWRyZXNzZSBlLW1haWwgdmFsaWRlIChkZSB0eXBlIHZvdXNAZm91cm5pc3NldXIuY29tKS48L3NwYW4+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgCgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0ZSIgbmFtZT0nZW1haWxfMScgaWQ9J2lucHV0LTEtZW1haWxfMScgdmFsdWU9IiIgCgkJCQkJCWNsYXNzPScgIGVtYWlsIGZvcm1sJyAKCQkJCQkJc2l6ZT0nNDAnIC8+CgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgdGV4dGVfMSc+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS10ZXh0ZV8xIj5Wb3RyZSBBZHJlc3NlPC9sYWJlbD4KCQkJCQkKCQkJCQkKCQkJCQk6CgkJCQk8L3NwYW4+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCSAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0icGx1Z2lucy9hZG1pbi8talF1ZXJ5L2ltZ19wYWNrL2xheWVyLmpzIj48L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvanMvc3BpcF9iYXJyZS5qcyI+PC9zY3JpcHQ+PHRhYmxlIGNsYXNzPSdzcGlwX2JhcnJlJyBzdHlsZT0nd2lkdGg6YXV0bzsnIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCcgYm9yZGVyPScwJyBzdW1tYXJ5PScnPgo8dHIgc3R5bGU9J3dpZHRoOiBhdXRvOycgY2xhc3M9J3NwaXBfYmFycmUnPgo8dGQgc3R5bGU9J3RleHQtYWxpZ246IGxlZnQ7JyB2YWxpZ249J21pZGRsZSc+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ3snLCd9Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGVuIHtpdGFsaXF1ZX0iIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnTWV0dHJlIGVuIHtpdGFsaXF1ZX0nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvaXRhbGlxdWUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGVuIHtpdGFsaXF1ZX0iIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCd7eycsJ319Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGVuIHt7Z3Jhc319IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ01ldHRyZSBlbiB7e2dyYXN9fScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9ncmFzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBlbiB7e2dyYXN9fSIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6c3dhcF9jb3VjaGUoJzInLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJUcmFuc2Zvcm1lciBlbiBbbGllbiBoeXBlcnRleHRlLT5odHRwOi8vLi4uXSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdUcmFuc2Zvcm1lciBlbiBbbGllbiBoeXBlcnRleHRlLT5odHRwOi8vLi4uXScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9saWVuLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IlRyYW5zZm9ybWVyIGVuIFtsaWVuIGh5cGVydGV4dGUtPmh0dHA6Ly8uLi5dIiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJyU1Q24lNUNuJTNDcXVvdGUlM0UnLCclM0MvcXVvdGUlM0UlNUNuJTVDbicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkNpdGVyIHVuIG1lc3NhZ2UiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnQ2l0ZXIgdW4gbWVzc2FnZScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9xdW90ZS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJDaXRlciB1biBtZXNzYWdlIiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQgc3R5bGU9J3RleHQtYWxpZ246bGVmdDsnIHZhbGlnbj0nbWlkZGxlJz48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCc0JywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iQ2FyYWN0JmVncmF2ZTtyZXMgc3AmZWFjdXRlO2NpYXV4IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0NhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9jbGF2aWVyLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkNhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eCIgLz48L2E+Jm5ic3A7PC90ZD48L3RyPgo8dHI+Cjx0ZCBjb2xzcGFuPSc2Jz48aW5wdXQgZGlzYWJsZWQ9J2Rpc2FibGVkJyB0eXBlPSd0ZXh0JyBpZD0nYmFycmVfMScgc2l6ZT0nNDUnIG1heGxlbmd0aD0nMTAwJyBzdHlsZT0nd2lkdGg6YXV0bzsgZm9udC1zaXplOjExcHg7IGNvbG9yOiBibGFjazsgYmFja2dyb3VuZC1jb2xvcjogI2U0ZTRlNDsgYm9yZGVyOiAwcHggc29saWQgI2RlZGVkZTsnCnZhbHVlPSJVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZSIgLz48L3RkPjwvdHI+PC90YWJsZT48ZGl2IGlkPSdMYXllcjEnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+PHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkPg0KTmIgY29sb25uZXM6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9uYmNvbG9uZXMiIHN0eWxlPSJ3aWR0aDogMzBweDsiIHZhbHVlPSIyIiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiICAgLz48L3RkPjx0ZD4NCk5iIGxpZ25lczogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX25icmFuZ3MiIHN0eWxlPSJ3aWR0aDogMzBweDsiIHZhbHVlPSIyIiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiIC8+PC90ZD48dGQ+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImJhcnJlX2RvZW50ZXRlIiB2YWx1ZT0iLTEiIGNoZWNrZWQ9ImNoZWNrZWQiIC8+IEVudGV0ZTwvdGQ+PHRkPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJiYXJyZV9kb2NhcHRpb24iIHZhbHVlPSItMSIgY2hlY2tlZD0iY2hlY2tlZCIgLz4gQ2FwdGlvbiBldCBSJmVhY3V0ZTtzdW0mZWFjdXRlOzwvdGQ+PHRkPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDoNCiAgICBiYXJyZV9uYmNvbG9uZXMudmFsdWUgPSBNYXRoLmFicyhiYXJyZV9uYmNvbG9uZXMudmFsdWUpOyBiYXJyZV9uYnJhbmdzLnZhbHVlDQogICAgPSBNYXRoLmFicyhiYXJyZV9uYnJhbmdzLnZhbHVlKTsNCiAgICBpZiAoIShiYXJyZV9uYmNvbG9uZXMudmFsdWUgPT0gMCB8fCBiYXJyZV9uYnJhbmdzLnZhbHVlID09IDApKSB7DQogICAgYmFycmVfdGFibGVhdShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJyksIGJhcnJlX25iY29sb25lcy52YWx1ZSwgYmFycmVfbmJyYW5ncy52YWx1ZSwNCiAgICBiYXJyZV9kb2VudGV0ZS5jaGVja2VkLCBiYXJyZV9kb2NhcHRpb24uY2hlY2tlZCk7IH0gIiAvPiANCjwvdGQ+PC90cj48L3RhYmxlPg0KPGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjInIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQogPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkPiANCkFkcmVzc2UmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX25vbSIgdmFsdWU9Imh0dHA6Ly8iIHNpemU9IjIxIiBtYXhsZW5ndGg9IjI1NSIgLz48YnIgLz4NCkJ1bGxlIGQnYWlkZSZuYnNwOzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxpZW5fYnVsbGUiIHZhbHVlPSIiIHNpemU9IjIxIiBtYXhsZW5ndGg9IjI1NSIgLz4NCjwvdGQ+PHRkPg0KTGFuZ3VlIGFiciZlYWN1dGU7ZyZlYWN1dGU7ZSZuYnNwOzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxpZW5fbGFuZ3VlIiB2YWx1ZT0iIiBzaXplPSIxMCIgbWF4bGVuZ3RoPSIxMCIgLz4NCjwvdGQ+PHRkPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9kZW1hbmRlX2xpZW4oJ1snLCAnLT4nLCAnXScsIGxpZW5fbm9tLnZhbHVlLCBsaWVuX2J1bGxlLnZhbHVlLCBsaWVuX2xhbmd1ZS52YWx1ZSxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpOyIgLz4gDQo8L3RkPjwvdHI+PC90YWJsZT4NCjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXIzJyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQogIDx0cj4NCiAgICA8dGQgc3R5bGU9IndpZHRoOmF1dG87IHRleHQtYWxpZ246Y2VudGVyOyI+PHN0cm9uZz5HZXN0aW9uIGRlcyBhbmNyZXM8L3N0cm9uZz48L3RkPg0KICAgIDx0ZCBzdHlsZT0id2lkdGg6YXV0bzsiPjxzdHJvbmc+VHJhbnNmb3JtZXIgZW4gYW5jcmU8L3N0cm9uZz48YnIgLz4NCiAgICA8bGFiZWwgZm9yPSJhbmNyZV9ub20iPjxpPk5vbSBkZSBsJ2FuY3JlPC9pPjwvbGFiZWw+IDxiciAvPg0KICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImFuY3JlX25vbSIgaWQ9ImFuY3JlX25vbSIgLz4NCgkgIA0KCTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIiBvbmNsaWNrPSJqYXZhc2NyaXB0OmJhcnJlX2FuY3JlKCdbJywgJzwtJywgJ10nLCBhbmNyZV9ub20udmFsdWUsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSk7IiAvPg0KICAgIDwvdGQ+DQoJPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyI+PHN0cm9uZz5Qb2ludGVyIHZlcnMgdW5lIGFuY3JlPC9zdHJvbmc+PGJyIC8+DQogICAgPGxhYmVsIGZvcj0iYW5jcmVfY2libGUiPjxpPkFuY3JlIGNpYmxlPC9pPjwvbGFiZWw+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9jaWJsZSIgaWQ9ImFuY3JlX2NpYmxlIiAvPjxiciAvPg0KCTxsYWJlbCBmb3I9ImFuY3JlX2J1bGxlIj48aT5CdWxsZSBkJ2FpZGUgYW5jcmU8L2k+PC9sYWJlbD4gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImFuY3JlX2J1bGxlIiBpZD0iYW5jcmVfYnVsbGUiIC8+DQoJPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfZGVtYW5kZSgnWycsICctPiMnLCAnXScsIGFuY3JlX2NpYmxlLnZhbHVlLCBhbmNyZV9idWxsZS52YWx1ZSwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKTsiIC8+IA0KPC90ZD4NCiAgPC90cj4gDQo8L3RhYmxlPjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXI0JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQogIDx0ciBjbGFzcz0ic3BpcF9iYXJyZSI+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDozMCU7Ij5DYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXg8L3RkPg0KICAgIDx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnXHUwMGFificsJ35cdTAwYmInLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJFbnRvdXJlciBkZSAmbGFxdW87IGd1aWxsZW1ldHMgJnJhcXVvOyIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdFbnRvdXJlciBkZSAmbGFxdW87IGd1aWxsZW1ldHMgJnJhcXVvOycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9ndWlsbGVtZXRzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudG91cmVyIGRlICZsYXF1bzsgZ3VpbGxlbWV0cyAmcmFxdW87IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnXHUwMDkzJywnXHUwMDk0Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iRW50b3VyZXIgZGUgJmxkcXVvO2d1aWxsZW1ldHMgZGUgc2Vjb25kIG5pdmVhdSZyZHF1bzsiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnRW50b3VyZXIgZGUgJmxkcXVvO2d1aWxsZW1ldHMgZGUgc2Vjb25kIG5pdmVhdSZyZHF1bzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZ3VpbGxlbWV0cy1zaW1wbGVzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudG91cmVyIGRlICZsZHF1bztndWlsbGVtZXRzIGRlIHNlY29uZCBuaXZlYXUmcmRxdW87IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjMCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEEgYWNjZW50IGdyYXZlIG1hanVzY3VsZSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBBIGFjY2VudCBncmF2ZSBtYWp1c2N1bGUnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvYWdyYXZlLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBBIGFjY2VudCBncmF2ZSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM5Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBhY2NlbnQgYWlndSBtYWp1c2N1bGUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBhY2NlbnQgYWlndSBtYWp1c2N1bGUnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZWFjdXRlLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGFjY2VudCBhaWd1IG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzgnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIG1hanVzY3VsZSBhY2NlbnQgZ3JhdmUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBtYWp1c2N1bGUgYWNjZW50IGdyYXZlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiPjxpbWcgc3JjPSdwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2VhZ3JhdmUtbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgbWFqdXNjdWxlIGFjY2VudCBncmF2ZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwZTYnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsXCdBJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiPjxpbWcgc3JjPSdwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FlbGlnLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM2Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSBtYWp1c2N1bGUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGxcJ0EgbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiPjxpbWcgc3JjPSdwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FlbGlnLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCcmb2VsaWc7Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbFwnTycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9vZWxpZy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJyZPRWxpZzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIG1hanVzY3VsZSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbFwnTyBtYWp1c2N1bGUnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvb2VsaWctbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ08gbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjNycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEMgYyZlYWN1dGU7ZGlsbGUgbWFqdXNjdWxlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEMgYyZlYWN1dGU7ZGlsbGUgbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiPjxpbWcgc3JjPSdwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2NjZWRpbC1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gQyBjJmVhY3V0ZTtkaWxsZSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignJmV1cm87Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgbGUgc3ltYm9sZSAmZXVybzsiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgbGUgc3ltYm9sZSAmZXVybzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZXVyby5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciBsZSBzeW1ib2xlICZldXJvOyIgLz48L2E+Jm5ic3A7DQogICAgPC90ZD4NCiAgPC90cj4gDQo8L3RhYmxlPg0KPGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjUnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQo8dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCjx0cj48dGQgc3R5bGU9IndpZHRoOiAyNSU7Ij5DaGVyY2hlcjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9jaGVyY2hlciIgdmFsdWU9IiIgc2l6ZT0iMTIiIG1heGxlbmd0aD0iMjU1IiAvPjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMjAlOyI+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY19jYXNlIiB2YWx1ZT0ieWVzIiAvPlJlc3BlY3RlciBsYSBjYXNzZTxiciAvPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjX2VudGllciIgdmFsdWU9InllcyIgLz4NCk1vdCBlbnRpZXINCjwvdGQ+PHRkICBzdHlsZT0id2lkdGg6IDI1JTsiPlJlbXBsYWNlcjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9yZW1wbGFjZXIiIHZhbHVlPSIiIHNpemU9IjEyIiBtYXhsZW5ndGg9IjI1NSIgLz4gDQo8L3RkPjx0ZCBzdHlsZT0id2lkdGg6IDIwJTsiPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZWNfdG91dCIgdmFsdWU9InllcyIgLz5Ub3V0IHJlbXBsYWNlcjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMTAlOyI+DQogICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyINCiAgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9zZWFyY2hyZXBsYWNlKGRvY3VtZW50LmZvcm11bGFpcmUuYmFycmVfY2hlcmNoZXIudmFsdWUsIGRvY3VtZW50LmZvcm11bGFpcmUuYmFycmVfcmVtcGxhY2VyLnZhbHVlLCBkb2N1bWVudC5mb3JtdWxhaXJlLnJlY190b3V0LmNoZWNrZWQsIGRvY3VtZW50LmZvcm11bGFpcmUucmVjX2Nhc2UuY2hlY2tlZCwgZG9jdW1lbnQuZm9ybXVsYWlyZS5yZWNfZW50aWVyLmNoZWNrZWQsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKTsiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+PGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj4KCTx0ZXh0YXJlYSBuYW1lPSd0ZXh0ZV8xJyByb3dzPScxMCcgY2xhc3M9J2Zvcm1vICAgJyBjb2xzPSc4MCcKCWlkPSdpbnB1dC0xLXRleHRlXzEnCglvbnNlbGVjdD0nc3RvcmVDYXJldCh0aGlzKTsnCglvbmNsaWNrPSdzdG9yZUNhcmV0KHRoaXMpOycKCW9ua2V5dXA9J3N0b3JlQ2FyZXQodGhpcyk7JwoJb25kYmxjbGljaz0nc3RvcmVDYXJldCh0aGlzKTsnPjwvdGV4dGFyZWE+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgdGV4dGVfMic+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS10ZXh0ZV8yIj5Wb3RyZSBRdWVzdGlvbjwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgIDx0YWJsZSBjbGFzcz0nc3BpcF9iYXJyZScgc3R5bGU9J3dpZHRoOmF1dG87JyBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnIGJvcmRlcj0nMCcgc3VtbWFyeT0nJz4KPHRyIHN0eWxlPSd3aWR0aDogYXV0bzsnIGNsYXNzPSdzcGlwX2JhcnJlJz4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOiBsZWZ0OycgdmFsaWduPSdtaWRkbGUnPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCd7JywnfScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBlbiB7aXRhbGlxdWV9IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ01ldHRyZSBlbiB7aXRhbGlxdWV9Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2l0YWxpcXVlLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBlbiB7aXRhbGlxdWV9IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgne3snLCd9fScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBlbiB7e2dyYXN9fSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdNZXR0cmUgZW4ge3tncmFzfX0nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZ3Jhcy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJNZXR0cmUgZW4ge3tncmFzfX0iIC8+PC9hPiZuYnNwOzwvdGQ+Cjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCc3JywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iVHJhbnNmb3JtZXIgZW4gW2xpZW4gaHlwZXJ0ZXh0ZS0+aHR0cDovLy4uLl0iIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnVHJhbnNmb3JtZXIgZW4gW2xpZW4gaHlwZXJ0ZXh0ZS0+aHR0cDovLy4uLl0nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvbGllbi5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJUcmFuc2Zvcm1lciBlbiBbbGllbiBoeXBlcnRleHRlLT5odHRwOi8vLi4uXSIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCclNUNuJTVDbiUzQ3F1b3RlJTNFJywnJTNDL3F1b3RlJTNFJTVDbiU1Q24nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJDaXRlciB1biBtZXNzYWdlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0NpdGVyIHVuIG1lc3NhZ2UnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvcXVvdGUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iQ2l0ZXIgdW4gbWVzc2FnZSIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOmxlZnQ7JyB2YWxpZ249J21pZGRsZSc+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnOScsJycpOyIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkNhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eCIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdDYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXgnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvY2xhdmllci5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJDYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXgiIC8+PC9hPiZuYnNwOzwvdGQ+PC90cj4KPHRyPgo8dGQgY29sc3Bhbj0nNic+PGlucHV0IGRpc2FibGVkPSdkaXNhYmxlZCcgdHlwZT0ndGV4dCcgaWQ9J2JhcnJlXzInIHNpemU9JzQ1JyBtYXhsZW5ndGg9JzEwMCcgc3R5bGU9J3dpZHRoOmF1dG87IGZvbnQtc2l6ZToxMXB4OyBjb2xvcjogYmxhY2s7IGJhY2tncm91bmQtY29sb3I6ICNlNGU0ZTQ7IGJvcmRlcjogMHB4IHNvbGlkICNkZWRlZGU7Jwp2YWx1ZT0iVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UiIC8+PC90ZD48L3RyPjwvdGFibGU+PGRpdiBpZD0nTGF5ZXI2JyBzdHlsZT0nZGlzcGxheTpub25lOycgPjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KPHRyPjx0ZD4NCk5iIGNvbG9ubmVzOiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYmFycmVfbmJjb2xvbmVzIiBzdHlsZT0id2lkdGg6IDMwcHg7IiB2YWx1ZT0iMiIgc2l6ZT0iMiIgbWF4bGVuZ3RoPSIyIiAgIC8+PC90ZD48dGQ+DQpOYiBsaWduZXM6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9uYnJhbmdzIiBzdHlsZT0id2lkdGg6IDMwcHg7IiB2YWx1ZT0iMiIgc2l6ZT0iMiIgbWF4bGVuZ3RoPSIyIiAvPjwvdGQ+PHRkPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJiYXJyZV9kb2VudGV0ZSIgdmFsdWU9Ii0xIiBjaGVja2VkPSJjaGVja2VkIiAvPiBFbnRldGU8L3RkPjx0ZD4NCjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iYmFycmVfZG9jYXB0aW9uIiB2YWx1ZT0iLTEiIGNoZWNrZWQ9ImNoZWNrZWQiIC8+IENhcHRpb24gZXQgUiZlYWN1dGU7c3VtJmVhY3V0ZTs8L3RkPjx0ZD4NCiAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6DQogICAgYmFycmVfbmJjb2xvbmVzLnZhbHVlID0gTWF0aC5hYnMoYmFycmVfbmJjb2xvbmVzLnZhbHVlKTsgYmFycmVfbmJyYW5ncy52YWx1ZQ0KICAgID0gTWF0aC5hYnMoYmFycmVfbmJyYW5ncy52YWx1ZSk7DQogICAgaWYgKCEoYmFycmVfbmJjb2xvbmVzLnZhbHVlID09IDAgfHwgYmFycmVfbmJyYW5ncy52YWx1ZSA9PSAwKSkgew0KICAgIGJhcnJlX3RhYmxlYXUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpLCBiYXJyZV9uYmNvbG9uZXMudmFsdWUsIGJhcnJlX25icmFuZ3MudmFsdWUsDQogICAgYmFycmVfZG9lbnRldGUuY2hlY2tlZCwgYmFycmVfZG9jYXB0aW9uLmNoZWNrZWQpOyB9ICIgLz4gDQo8L3RkPjwvdHI+PC90YWJsZT4NCjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXI3JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KIDx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KPHRyPjx0ZD4gDQpBZHJlc3NlJm5ic3A7OiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibGllbl9ub20iIHZhbHVlPSJodHRwOi8vIiBzaXplPSIyMSIgbWF4bGVuZ3RoPSIyNTUiIC8+PGJyIC8+DQpCdWxsZSBkJ2FpZGUmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX2J1bGxlIiB2YWx1ZT0iIiBzaXplPSIyMSIgbWF4bGVuZ3RoPSIyNTUiIC8+DQo8L3RkPjx0ZD4NCkxhbmd1ZSBhYnImZWFjdXRlO2cmZWFjdXRlO2UmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX2xhbmd1ZSIgdmFsdWU9IiIgc2l6ZT0iMTAiIG1heGxlbmd0aD0iMTAiIC8+DQo8L3RkPjx0ZD4NCiAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfZGVtYW5kZV9saWVuKCdbJywgJy0+JywgJ10nLCBsaWVuX25vbS52YWx1ZSwgbGllbl9idWxsZS52YWx1ZSwgbGllbl9sYW5ndWUudmFsdWUsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKTsiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+DQo8ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyOCcgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID4NCjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KICA8dHI+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyB0ZXh0LWFsaWduOmNlbnRlcjsiPjxzdHJvbmc+R2VzdGlvbiBkZXMgYW5jcmVzPC9zdHJvbmc+PC90ZD4NCiAgICA8dGQgc3R5bGU9IndpZHRoOmF1dG87Ij48c3Ryb25nPlRyYW5zZm9ybWVyIGVuIGFuY3JlPC9zdHJvbmc+PGJyIC8+DQogICAgPGxhYmVsIGZvcj0iYW5jcmVfbm9tIj48aT5Ob20gZGUgbCdhbmNyZTwvaT48L2xhYmVsPiA8YnIgLz4NCiAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9ub20iIGlkPSJhbmNyZV9ub20iIC8+DQoJICANCgk8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9hbmNyZSgnWycsICc8LScsICddJywgYW5jcmVfbm9tLnZhbHVlLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpOyIgLz4NCiAgICA8L3RkPg0KCTx0ZCBzdHlsZT0id2lkdGg6YXV0bzsiPjxzdHJvbmc+UG9pbnRlciB2ZXJzIHVuZSBhbmNyZTwvc3Ryb25nPjxiciAvPg0KICAgIDxsYWJlbCBmb3I9ImFuY3JlX2NpYmxlIj48aT5BbmNyZSBjaWJsZTwvaT48L2xhYmVsPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYW5jcmVfY2libGUiIGlkPSJhbmNyZV9jaWJsZSIgLz48YnIgLz4NCgk8bGFiZWwgZm9yPSJhbmNyZV9idWxsZSI+PGk+QnVsbGUgZCdhaWRlIGFuY3JlPC9pPjwvbGFiZWw+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9idWxsZSIgaWQ9ImFuY3JlX2J1bGxlIiAvPg0KCTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIiBvbmNsaWNrPSJqYXZhc2NyaXB0OmJhcnJlX2RlbWFuZGUoJ1snLCAnLT4jJywgJ10nLCBhbmNyZV9jaWJsZS52YWx1ZSwgYW5jcmVfYnVsbGUudmFsdWUsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSk7IiAvPiANCjwvdGQ+DQogIDwvdHI+IA0KPC90YWJsZT48ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyOScgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID4NCjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KICA8dHIgY2xhc3M9InNwaXBfYmFycmUiPg0KICAgIDx0ZCBzdHlsZT0id2lkdGg6MzAlOyI+Q2FyYWN0JmVncmF2ZTtyZXMgc3AmZWFjdXRlO2NpYXV4PC90ZD4NCiAgICA8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ1x1MDBhYn4nLCd+XHUwMGJiJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iRW50b3VyZXIgZGUgJmxhcXVvOyBndWlsbGVtZXRzICZyYXF1bzsiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnRW50b3VyZXIgZGUgJmxhcXVvOyBndWlsbGVtZXRzICZyYXF1bzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZ3VpbGxlbWV0cy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJFbnRvdXJlciBkZSAmbGFxdW87IGd1aWxsZW1ldHMgJnJhcXVvOyIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ1x1MDA5MycsJ1x1MDA5NCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkVudG91cmVyIGRlICZsZHF1bztndWlsbGVtZXRzIGRlIHNlY29uZCBuaXZlYXUmcmRxdW87IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0VudG91cmVyIGRlICZsZHF1bztndWlsbGVtZXRzIGRlIHNlY29uZCBuaXZlYXUmcmRxdW87Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2d1aWxsZW1ldHMtc2ltcGxlcy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJFbnRvdXJlciBkZSAmbGRxdW87Z3VpbGxlbWV0cyBkZSBzZWNvbmQgbml2ZWF1JnJkcXVvOyIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzAnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBBIGFjY2VudCBncmF2ZSBtYWp1c2N1bGUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gQSBhY2NlbnQgZ3JhdmUgbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FncmF2ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gQSBhY2NlbnQgZ3JhdmUgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjOScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgYWNjZW50IGFpZ3UgbWFqdXNjdWxlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEUgYWNjZW50IGFpZ3UgbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2VhY3V0ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBhY2NlbnQgYWlndSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM4Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBtYWp1c2N1bGUgYWNjZW50IGdyYXZlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEUgbWFqdXNjdWxlIGFjY2VudCBncmF2ZScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9lYWdyYXZlLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIG1hanVzY3VsZSBhY2NlbnQgZ3JhdmUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGU2Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbFwnQScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9hZWxpZy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjNicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EgbWFqdXNjdWxlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsXCdBIG1hanVzY3VsZScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9hZWxpZy1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignJm9lbGlnOycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ08iIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGxcJ08nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvb2VsaWcucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCcmT0VsaWc7Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyBtYWp1c2N1bGUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGxcJ08gbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL29lbGlnLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzcnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBDIGMmZWFjdXRlO2RpbGxlIG1hanVzY3VsZSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBDIGMmZWFjdXRlO2RpbGxlIG1hanVzY3VsZScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9jY2VkaWwtbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEMgYyZlYWN1dGU7ZGlsbGUgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJyZldXJvOycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIGxlIHN5bWJvbGUgJmV1cm87IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIGxlIHN5bWJvbGUgJmV1cm87Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2V1cm8ucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgbGUgc3ltYm9sZSAmZXVybzsiIC8+PC9hPiZuYnNwOw0KICAgIDwvdGQ+DQogIDwvdHI+IA0KPC90YWJsZT4NCjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXIxMCcgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID4NCjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KPHRyPjx0ZCBzdHlsZT0id2lkdGg6IDI1JTsiPkNoZXJjaGVyPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX2NoZXJjaGVyIiB2YWx1ZT0iIiBzaXplPSIxMiIgbWF4bGVuZ3RoPSIyNTUiIC8+PC90ZD48dGQgc3R5bGU9IndpZHRoOiAyMCU7Ij4NCjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjX2Nhc2UiIHZhbHVlPSJ5ZXMiIC8+UmVzcGVjdGVyIGxhIGNhc3NlPGJyIC8+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZWNfZW50aWVyIiB2YWx1ZT0ieWVzIiAvPg0KTW90IGVudGllcg0KPC90ZD48dGQgIHN0eWxlPSJ3aWR0aDogMjUlOyI+UmVtcGxhY2VyPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX3JlbXBsYWNlciIgdmFsdWU9IiIgc2l6ZT0iMTIiIG1heGxlbmd0aD0iMjU1IiAvPiANCjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMjAlOyI+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY190b3V0IiB2YWx1ZT0ieWVzIiAvPlRvdXQgcmVtcGxhY2VyPC90ZD48dGQgc3R5bGU9IndpZHRoOiAxMCU7Ij4NCiAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIg0KICBvbmNsaWNrPSJqYXZhc2NyaXB0OmJhcnJlX3NlYXJjaHJlcGxhY2UoZG9jdW1lbnQuZm9ybXVsYWlyZS5iYXJyZV9jaGVyY2hlci52YWx1ZSwgZG9jdW1lbnQuZm9ybXVsYWlyZS5iYXJyZV9yZW1wbGFjZXIudmFsdWUsIGRvY3VtZW50LmZvcm11bGFpcmUucmVjX3RvdXQuY2hlY2tlZCwgZG9jdW1lbnQuZm9ybXVsYWlyZS5yZWNfY2FzZS5jaGVja2VkLCBkb2N1bWVudC5mb3JtdWxhaXJlLnJlY19lbnRpZXIuY2hlY2tlZCxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpOyIgLz4gDQo8L3RkPjwvdHI+PC90YWJsZT48ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PgoJPHRleHRhcmVhIG5hbWU9J3RleHRlXzInIHJvd3M9JzEwJyBjbGFzcz0nZm9ybWwgICAnIGNvbHM9JzgwJwoJaWQ9J2lucHV0LTEtdGV4dGVfMicKCW9uc2VsZWN0PSdzdG9yZUNhcmV0KHRoaXMpOycKCW9uY2xpY2s9J3N0b3JlQ2FyZXQodGhpcyk7JwoJb25rZXl1cD0nc3RvcmVDYXJldCh0aGlzKTsnCglvbmRibGNsaWNrPSdzdG9yZUNhcmV0KHRoaXMpOyc+PC90ZXh0YXJlYT4KCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCTxzcGFuIGNsYXNzPSduZXR0b3lldXInPiA8L3NwYW4+CgkJCQoJCTwvZGl2PgoJCgoKIAoJPC9maWVsZHNldD4KCiAKIAoJCgk8cCBzdHlsZT0nZGlzcGxheTpub25lOyc+PGxhYmVsIGZvcj0ibm9ib3Rub2JvdC0xIj5WZXVpbGxleiBsYWlzc2VyIGNlIGNoYW1wIHZpZGUmbmJzcDs6PC9sYWJlbD4KCTxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJub2JvdG5vYm90IiBpZD0ibm9ib3Rub2JvdC0xIiB2YWx1ZT0iIiBzaXplPSIxMCIgLz48L3A+CgkKCTxkaXYgc3R5bGU9J3RleHQtYWxpZ246cmlnaHQnIGNsYXNzPSdzcGlwX2JvdXRvbic+PGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0nVmFsaWRlcicgdmFsdWU9IlZhbGlkZXIiIC8+PC9kaXY+CgoKPHNjcmlwdCBzcmM9Imh0dHA6Ly9wcmVwcm9kLm5vdHJlLXZpbGxlLm5ldC9+c3RzZWIvcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvZm9ybXMvamF2YXNjcmlwdC9qdGlwLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwhLS0KJCgnaW5wdXQuZm9ybW8nKS5iaW5kKCdmb2N1cycsZnVuY3Rpb24oKXskKHRoaXMpLnJlbW92ZUNsYXNzKCdmb3JtbycpLmFkZENsYXNzKCdmb3Jtby1mb2N1cycpO30pOwokKCdpbnB1dC5mb3JtbycpLmJpbmQoJ2JsdXInLGZ1bmN0aW9uKCl7JCh0aGlzKS5yZW1vdmVDbGFzcygnZm9ybW8tZm9jdXMnKS5hZGRDbGFzcygnZm9ybW8nKTt9KTsKJCgnaW5wdXQuZm9ybWwnKS5iaW5kKCdmb2N1cycsZnVuY3Rpb24oKXskKHRoaXMpLnJlbW92ZUNsYXNzKCdmb3JtbCcpLmFkZENsYXNzKCdmb3JtbC1mb2N1cycpO30pOwokKCdpbnB1dC5mb3JtbCcpLmJpbmQoJ2JsdXInLGZ1bmN0aW9uKCl7JCh0aGlzKS5yZW1vdmVDbGFzcygnZm9ybWwtZm9jdXMnKS5hZGRDbGFzcygnZm9ybWwnKTt9KTsKCi8vLS0+PC9zY3JpcHQ+CgoJIAoJPC9mb3JtPgoJCgkKCQoKCjwvZGl2Pg==',
211
-				'balise' => '<div class="base64" title="PGEgbmFtZT0nZm9ybTEnPjwvYT4KPGRpdiBjbGFzcz0nc3BpcF9mb3Jtcyc+Cgo8ZGl2IGNsYXNzPSdzcGlwX2Rlc2NyaXB0aWYnPjwvZGl2PgoKCgoKIAoJIAoJPGZvcm0gbWV0aG9kPSdwb3N0JyBhY3Rpb249J0NvbnRhY3QuaHRtbCNmb3JtMScKCQllbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KCQkKCQk8ZGl2PgoJCQoJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2Fqb3V0X3JlcG9uc2UnIHZhbHVlPScxJyAvPgoJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2lkX2Rvbm5lZScgdmFsdWU9Jy0xMCcgLz4KCQkKCQk8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdyZXRvdXJfZm9ybScgdmFsdWU9JycgLz4KCQkKCQk8L2Rpdj4KCQkJCgoKIAoJIAoJCQoJCSA8ZmllbGRzZXQ+PGxlZ2VuZD5Ob3VzIGNvbnRhY3RlcjwvbGVnZW5kPiAKCQoJIAoJCTxkaXYgY2xhc3M9J3NwaXBfZm9ybV9jaGFtcCBsaWduZV8xJz4KCQkJCgkJCSAKCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWwnPgoJCQkJCSA8bGFiZWwgZm9yPSJpbnB1dC0xLWxpZ25lXzEiPlZvdHJlIE5vbTwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCSAKCQkJCQoJCQkJPGlucHV0IHR5cGU9InRleHRlIiBuYW1lPSdsaWduZV8xJyBpZD0naW5wdXQtMS1saWduZV8xJyB2YWx1ZT0iIiAKCQkJCQkJY2xhc3M9JyAgbGlnbmUgZm9ybWwnIAoJCQkJCQlzaXplPSc0MCcgLz4KCQkJCQoJCQkJCgkJCQkKCQkJCTxzcGFuIGNsYXNzPSduZXR0b3lldXInPiA8L3NwYW4+CgkJCQoJCTwvZGl2PgoJCgoKCiAKCSAKCQkKCQkKCQoJIAoJCTxkaXYgY2xhc3M9J3NwaXBfZm9ybV9jaGFtcCBsaWduZV8yJz4KCQkJCgkJCSAKCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWwnPgoJCQkJCSA8bGFiZWwgZm9yPSJpbnB1dC0xLWxpZ25lXzIiPlZvdHJlIFByw6lub208L2xhYmVsPgoJCQkJCQoJCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWxfb2JsaWdhdG9pcmUnPgoJCQkJCQlbT2JsaWdhdG9pcmVdPC9zcGFuPgoJCQkJCToKCQkJCTwvc3Bhbj4KCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgCgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0ZSIgbmFtZT0nbGlnbmVfMicgaWQ9J2lucHV0LTEtbGlnbmVfMicgdmFsdWU9IiIgCgkJCQkJCWNsYXNzPScgIGxpZ25lIGZvcm1sJyAKCQkJCQkJc2l6ZT0nNDAnIC8+CgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgZW1haWxfMSc+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS1lbWFpbF8xIj5Wb3RyZSBlbWFpbDwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsX2RldGFpbHMnPlZldWlsbGV6IGVudHJlciB1bmUgYWRyZXNzZSBlLW1haWwgdmFsaWRlIChkZSB0eXBlIHZvdXNAZm91cm5pc3NldXIuY29tKS48L3NwYW4+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgCgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0ZSIgbmFtZT0nZW1haWxfMScgaWQ9J2lucHV0LTEtZW1haWxfMScgdmFsdWU9IiIgCgkJCQkJCWNsYXNzPScgIGVtYWlsIGZvcm1sJyAKCQkJCQkJc2l6ZT0nNDAnIC8+CgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgdGV4dGVfMSc+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS10ZXh0ZV8xIj5Wb3RyZSBBZHJlc3NlPC9sYWJlbD4KCQkJCQkKCQkJCQkKCQkJCQk6CgkJCQk8L3NwYW4+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCSAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0icGx1Z2lucy9hZG1pbi8talF1ZXJ5L2ltZ19wYWNrL2xheWVyLmpzIj48L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvanMvc3BpcF9iYXJyZS5qcyI+PC9zY3JpcHQ+PHRhYmxlIGNsYXNzPSdzcGlwX2JhcnJlJyBzdHlsZT0nd2lkdGg6YXV0bzsnIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCcgYm9yZGVyPScwJyBzdW1tYXJ5PScnPgo8dHIgc3R5bGU9J3dpZHRoOiBhdXRvOycgY2xhc3M9J3NwaXBfYmFycmUnPgo8dGQgc3R5bGU9J3RleHQtYWxpZ246IGxlZnQ7JyB2YWxpZ249J21pZGRsZSc+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ3snLCd9Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGVuIHtpdGFsaXF1ZX0iIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnTWV0dHJlIGVuIHtpdGFsaXF1ZX0nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvaXRhbGlxdWUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGVuIHtpdGFsaXF1ZX0iIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCd7eycsJ319Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGVuIHt7Z3Jhc319IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ01ldHRyZSBlbiB7e2dyYXN9fScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9ncmFzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBlbiB7e2dyYXN9fSIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6c3dhcF9jb3VjaGUoJzInLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJUcmFuc2Zvcm1lciBlbiBbbGllbiBoeXBlcnRleHRlLT5odHRwOi8vLi4uXSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdUcmFuc2Zvcm1lciBlbiBbbGllbiBoeXBlcnRleHRlLT5odHRwOi8vLi4uXScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9saWVuLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IlRyYW5zZm9ybWVyIGVuIFtsaWVuIGh5cGVydGV4dGUtPmh0dHA6Ly8uLi5dIiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJyU1Q24lNUNuJTNDcXVvdGUlM0UnLCclM0MvcXVvdGUlM0UlNUNuJTVDbicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkNpdGVyIHVuIG1lc3NhZ2UiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnQ2l0ZXIgdW4gbWVzc2FnZScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9xdW90ZS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJDaXRlciB1biBtZXNzYWdlIiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQgc3R5bGU9J3RleHQtYWxpZ246bGVmdDsnIHZhbGlnbj0nbWlkZGxlJz48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCc0JywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iQ2FyYWN0JmVncmF2ZTtyZXMgc3AmZWFjdXRlO2NpYXV4IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0NhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9jbGF2aWVyLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkNhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eCIgLz48L2E+Jm5ic3A7PC90ZD48L3RyPgo8dHI+Cjx0ZCBjb2xzcGFuPSc2Jz48aW5wdXQgZGlzYWJsZWQ9J2Rpc2FibGVkJyB0eXBlPSd0ZXh0JyBpZD0nYmFycmVfMScgc2l6ZT0nNDUnIG1heGxlbmd0aD0nMTAwJyBzdHlsZT0nd2lkdGg6YXV0bzsgZm9udC1zaXplOjExcHg7IGNvbG9yOiBibGFjazsgYmFja2dyb3VuZC1jb2xvcjogI2U0ZTRlNDsgYm9yZGVyOiAwcHggc29saWQgI2RlZGVkZTsnCnZhbHVlPSJVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZSIgLz48L3RkPjwvdHI+PC90YWJsZT48ZGl2IGlkPSdMYXllcjEnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+PHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkPg0KTmIgY29sb25uZXM6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9uYmNvbG9uZXMiIHN0eWxlPSJ3aWR0aDogMzBweDsiIHZhbHVlPSIyIiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiICAgLz48L3RkPjx0ZD4NCk5iIGxpZ25lczogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX25icmFuZ3MiIHN0eWxlPSJ3aWR0aDogMzBweDsiIHZhbHVlPSIyIiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiIC8+PC90ZD48dGQ+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImJhcnJlX2RvZW50ZXRlIiB2YWx1ZT0iLTEiIGNoZWNrZWQ9ImNoZWNrZWQiIC8+IEVudGV0ZTwvdGQ+PHRkPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJiYXJyZV9kb2NhcHRpb24iIHZhbHVlPSItMSIgY2hlY2tlZD0iY2hlY2tlZCIgLz4gQ2FwdGlvbiBldCBSJmVhY3V0ZTtzdW0mZWFjdXRlOzwvdGQ+PHRkPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDoNCiAgICBiYXJyZV9uYmNvbG9uZXMudmFsdWUgPSBNYXRoLmFicyhiYXJyZV9uYmNvbG9uZXMudmFsdWUpOyBiYXJyZV9uYnJhbmdzLnZhbHVlDQogICAgPSBNYXRoLmFicyhiYXJyZV9uYnJhbmdzLnZhbHVlKTsNCiAgICBpZiAoIShiYXJyZV9uYmNvbG9uZXMudmFsdWUgPT0gMCB8fCBiYXJyZV9uYnJhbmdzLnZhbHVlID09IDApKSB7DQogICAgYmFycmVfdGFibGVhdShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJyksIGJhcnJlX25iY29sb25lcy52YWx1ZSwgYmFycmVfbmJyYW5ncy52YWx1ZSwNCiAgICBiYXJyZV9kb2VudGV0ZS5jaGVja2VkLCBiYXJyZV9kb2NhcHRpb24uY2hlY2tlZCk7IH0gIiAvPiANCjwvdGQ+PC90cj48L3RhYmxlPg0KPGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjInIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQogPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkPiANCkFkcmVzc2UmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX25vbSIgdmFsdWU9Imh0dHA6Ly8iIHNpemU9IjIxIiBtYXhsZW5ndGg9IjI1NSIgLz48YnIgLz4NCkJ1bGxlIGQnYWlkZSZuYnNwOzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxpZW5fYnVsbGUiIHZhbHVlPSIiIHNpemU9IjIxIiBtYXhsZW5ndGg9IjI1NSIgLz4NCjwvdGQ+PHRkPg0KTGFuZ3VlIGFiciZlYWN1dGU7ZyZlYWN1dGU7ZSZuYnNwOzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxpZW5fbGFuZ3VlIiB2YWx1ZT0iIiBzaXplPSIxMCIgbWF4bGVuZ3RoPSIxMCIgLz4NCjwvdGQ+PHRkPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9kZW1hbmRlX2xpZW4oJ1snLCAnLT4nLCAnXScsIGxpZW5fbm9tLnZhbHVlLCBsaWVuX2J1bGxlLnZhbHVlLCBsaWVuX2xhbmd1ZS52YWx1ZSxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpOyIgLz4gDQo8L3RkPjwvdHI+PC90YWJsZT4NCjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXIzJyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQogIDx0cj4NCiAgICA8dGQgc3R5bGU9IndpZHRoOmF1dG87IHRleHQtYWxpZ246Y2VudGVyOyI+PHN0cm9uZz5HZXN0aW9uIGRlcyBhbmNyZXM8L3N0cm9uZz48L3RkPg0KICAgIDx0ZCBzdHlsZT0id2lkdGg6YXV0bzsiPjxzdHJvbmc+VHJhbnNmb3JtZXIgZW4gYW5jcmU8L3N0cm9uZz48YnIgLz4NCiAgICA8bGFiZWwgZm9yPSJhbmNyZV9ub20iPjxpPk5vbSBkZSBsJ2FuY3JlPC9pPjwvbGFiZWw+IDxiciAvPg0KICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImFuY3JlX25vbSIgaWQ9ImFuY3JlX25vbSIgLz4NCgkgIA0KCTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIiBvbmNsaWNrPSJqYXZhc2NyaXB0OmJhcnJlX2FuY3JlKCdbJywgJzwtJywgJ10nLCBhbmNyZV9ub20udmFsdWUsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSk7IiAvPg0KICAgIDwvdGQ+DQoJPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyI+PHN0cm9uZz5Qb2ludGVyIHZlcnMgdW5lIGFuY3JlPC9zdHJvbmc+PGJyIC8+DQogICAgPGxhYmVsIGZvcj0iYW5jcmVfY2libGUiPjxpPkFuY3JlIGNpYmxlPC9pPjwvbGFiZWw+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9jaWJsZSIgaWQ9ImFuY3JlX2NpYmxlIiAvPjxiciAvPg0KCTxsYWJlbCBmb3I9ImFuY3JlX2J1bGxlIj48aT5CdWxsZSBkJ2FpZGUgYW5jcmU8L2k+PC9sYWJlbD4gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImFuY3JlX2J1bGxlIiBpZD0iYW5jcmVfYnVsbGUiIC8+DQoJPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfZGVtYW5kZSgnWycsICctPiMnLCAnXScsIGFuY3JlX2NpYmxlLnZhbHVlLCBhbmNyZV9idWxsZS52YWx1ZSwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKTsiIC8+IA0KPC90ZD4NCiAgPC90cj4gDQo8L3RhYmxlPjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXI0JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQogIDx0ciBjbGFzcz0ic3BpcF9iYXJyZSI+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDozMCU7Ij5DYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXg8L3RkPg0KICAgIDx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnXHUwMGFificsJ35cdTAwYmInLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJFbnRvdXJlciBkZSAmbGFxdW87IGd1aWxsZW1ldHMgJnJhcXVvOyIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdFbnRvdXJlciBkZSAmbGFxdW87IGd1aWxsZW1ldHMgJnJhcXVvOycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9ndWlsbGVtZXRzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudG91cmVyIGRlICZsYXF1bzsgZ3VpbGxlbWV0cyAmcmFxdW87IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnXHUwMDkzJywnXHUwMDk0Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iRW50b3VyZXIgZGUgJmxkcXVvO2d1aWxsZW1ldHMgZGUgc2Vjb25kIG5pdmVhdSZyZHF1bzsiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnRW50b3VyZXIgZGUgJmxkcXVvO2d1aWxsZW1ldHMgZGUgc2Vjb25kIG5pdmVhdSZyZHF1bzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZ3VpbGxlbWV0cy1zaW1wbGVzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudG91cmVyIGRlICZsZHF1bztndWlsbGVtZXRzIGRlIHNlY29uZCBuaXZlYXUmcmRxdW87IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjMCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEEgYWNjZW50IGdyYXZlIG1hanVzY3VsZSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBBIGFjY2VudCBncmF2ZSBtYWp1c2N1bGUnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvYWdyYXZlLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBBIGFjY2VudCBncmF2ZSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM5Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBhY2NlbnQgYWlndSBtYWp1c2N1bGUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBhY2NlbnQgYWlndSBtYWp1c2N1bGUnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZWFjdXRlLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGFjY2VudCBhaWd1IG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzgnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIG1hanVzY3VsZSBhY2NlbnQgZ3JhdmUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBtYWp1c2N1bGUgYWNjZW50IGdyYXZlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiPjxpbWcgc3JjPSdwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2VhZ3JhdmUtbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgbWFqdXNjdWxlIGFjY2VudCBncmF2ZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwZTYnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsXCdBJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiPjxpbWcgc3JjPSdwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FlbGlnLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM2Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSBtYWp1c2N1bGUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGxcJ0EgbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiPjxpbWcgc3JjPSdwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FlbGlnLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCcmb2VsaWc7Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbFwnTycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9vZWxpZy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJyZPRWxpZzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIG1hanVzY3VsZSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbFwnTyBtYWp1c2N1bGUnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvb2VsaWctbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ08gbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjNycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEMgYyZlYWN1dGU7ZGlsbGUgbWFqdXNjdWxlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEMgYyZlYWN1dGU7ZGlsbGUgbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiPjxpbWcgc3JjPSdwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2NjZWRpbC1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gQyBjJmVhY3V0ZTtkaWxsZSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignJmV1cm87Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgbGUgc3ltYm9sZSAmZXVybzsiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgbGUgc3ltYm9sZSAmZXVybzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZXVyby5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciBsZSBzeW1ib2xlICZldXJvOyIgLz48L2E+Jm5ic3A7DQogICAgPC90ZD4NCiAgPC90cj4gDQo8L3RhYmxlPg0KPGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjUnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQo8dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCjx0cj48dGQgc3R5bGU9IndpZHRoOiAyNSU7Ij5DaGVyY2hlcjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9jaGVyY2hlciIgdmFsdWU9IiIgc2l6ZT0iMTIiIG1heGxlbmd0aD0iMjU1IiAvPjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMjAlOyI+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY19jYXNlIiB2YWx1ZT0ieWVzIiAvPlJlc3BlY3RlciBsYSBjYXNzZTxiciAvPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjX2VudGllciIgdmFsdWU9InllcyIgLz4NCk1vdCBlbnRpZXINCjwvdGQ+PHRkICBzdHlsZT0id2lkdGg6IDI1JTsiPlJlbXBsYWNlcjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9yZW1wbGFjZXIiIHZhbHVlPSIiIHNpemU9IjEyIiBtYXhsZW5ndGg9IjI1NSIgLz4gDQo8L3RkPjx0ZCBzdHlsZT0id2lkdGg6IDIwJTsiPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZWNfdG91dCIgdmFsdWU9InllcyIgLz5Ub3V0IHJlbXBsYWNlcjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMTAlOyI+DQogICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyINCiAgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9zZWFyY2hyZXBsYWNlKGRvY3VtZW50LmZvcm11bGFpcmUuYmFycmVfY2hlcmNoZXIudmFsdWUsIGRvY3VtZW50LmZvcm11bGFpcmUuYmFycmVfcmVtcGxhY2VyLnZhbHVlLCBkb2N1bWVudC5mb3JtdWxhaXJlLnJlY190b3V0LmNoZWNrZWQsIGRvY3VtZW50LmZvcm11bGFpcmUucmVjX2Nhc2UuY2hlY2tlZCwgZG9jdW1lbnQuZm9ybXVsYWlyZS5yZWNfZW50aWVyLmNoZWNrZWQsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKTsiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+PGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj4KCTx0ZXh0YXJlYSBuYW1lPSd0ZXh0ZV8xJyByb3dzPScxMCcgY2xhc3M9J2Zvcm1vICAgJyBjb2xzPSc4MCcKCWlkPSdpbnB1dC0xLXRleHRlXzEnCglvbnNlbGVjdD0nc3RvcmVDYXJldCh0aGlzKTsnCglvbmNsaWNrPSdzdG9yZUNhcmV0KHRoaXMpOycKCW9ua2V5dXA9J3N0b3JlQ2FyZXQodGhpcyk7JwoJb25kYmxjbGljaz0nc3RvcmVDYXJldCh0aGlzKTsnPjwvdGV4dGFyZWE+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgdGV4dGVfMic+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS10ZXh0ZV8yIj5Wb3RyZSBRdWVzdGlvbjwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgIDx0YWJsZSBjbGFzcz0nc3BpcF9iYXJyZScgc3R5bGU9J3dpZHRoOmF1dG87JyBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnIGJvcmRlcj0nMCcgc3VtbWFyeT0nJz4KPHRyIHN0eWxlPSd3aWR0aDogYXV0bzsnIGNsYXNzPSdzcGlwX2JhcnJlJz4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOiBsZWZ0OycgdmFsaWduPSdtaWRkbGUnPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCd7JywnfScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBlbiB7aXRhbGlxdWV9IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ01ldHRyZSBlbiB7aXRhbGlxdWV9Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2l0YWxpcXVlLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBlbiB7aXRhbGlxdWV9IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgne3snLCd9fScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBlbiB7e2dyYXN9fSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdNZXR0cmUgZW4ge3tncmFzfX0nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZ3Jhcy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJNZXR0cmUgZW4ge3tncmFzfX0iIC8+PC9hPiZuYnNwOzwvdGQ+Cjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCc3JywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iVHJhbnNmb3JtZXIgZW4gW2xpZW4gaHlwZXJ0ZXh0ZS0+aHR0cDovLy4uLl0iIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnVHJhbnNmb3JtZXIgZW4gW2xpZW4gaHlwZXJ0ZXh0ZS0+aHR0cDovLy4uLl0nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvbGllbi5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJUcmFuc2Zvcm1lciBlbiBbbGllbiBoeXBlcnRleHRlLT5odHRwOi8vLi4uXSIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCclNUNuJTVDbiUzQ3F1b3RlJTNFJywnJTNDL3F1b3RlJTNFJTVDbiU1Q24nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJDaXRlciB1biBtZXNzYWdlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0NpdGVyIHVuIG1lc3NhZ2UnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvcXVvdGUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iQ2l0ZXIgdW4gbWVzc2FnZSIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOmxlZnQ7JyB2YWxpZ249J21pZGRsZSc+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnOScsJycpOyIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkNhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eCIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdDYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXgnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvY2xhdmllci5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJDYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXgiIC8+PC9hPiZuYnNwOzwvdGQ+PC90cj4KPHRyPgo8dGQgY29sc3Bhbj0nNic+PGlucHV0IGRpc2FibGVkPSdkaXNhYmxlZCcgdHlwZT0ndGV4dCcgaWQ9J2JhcnJlXzInIHNpemU9JzQ1JyBtYXhsZW5ndGg9JzEwMCcgc3R5bGU9J3dpZHRoOmF1dG87IGZvbnQtc2l6ZToxMXB4OyBjb2xvcjogYmxhY2s7IGJhY2tncm91bmQtY29sb3I6ICNlNGU0ZTQ7IGJvcmRlcjogMHB4IHNvbGlkICNkZWRlZGU7Jwp2YWx1ZT0iVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UiIC8+PC90ZD48L3RyPjwvdGFibGU+PGRpdiBpZD0nTGF5ZXI2JyBzdHlsZT0nZGlzcGxheTpub25lOycgPjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KPHRyPjx0ZD4NCk5iIGNvbG9ubmVzOiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYmFycmVfbmJjb2xvbmVzIiBzdHlsZT0id2lkdGg6IDMwcHg7IiB2YWx1ZT0iMiIgc2l6ZT0iMiIgbWF4bGVuZ3RoPSIyIiAgIC8+PC90ZD48dGQ+DQpOYiBsaWduZXM6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9uYnJhbmdzIiBzdHlsZT0id2lkdGg6IDMwcHg7IiB2YWx1ZT0iMiIgc2l6ZT0iMiIgbWF4bGVuZ3RoPSIyIiAvPjwvdGQ+PHRkPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJiYXJyZV9kb2VudGV0ZSIgdmFsdWU9Ii0xIiBjaGVja2VkPSJjaGVja2VkIiAvPiBFbnRldGU8L3RkPjx0ZD4NCjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iYmFycmVfZG9jYXB0aW9uIiB2YWx1ZT0iLTEiIGNoZWNrZWQ9ImNoZWNrZWQiIC8+IENhcHRpb24gZXQgUiZlYWN1dGU7c3VtJmVhY3V0ZTs8L3RkPjx0ZD4NCiAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6DQogICAgYmFycmVfbmJjb2xvbmVzLnZhbHVlID0gTWF0aC5hYnMoYmFycmVfbmJjb2xvbmVzLnZhbHVlKTsgYmFycmVfbmJyYW5ncy52YWx1ZQ0KICAgID0gTWF0aC5hYnMoYmFycmVfbmJyYW5ncy52YWx1ZSk7DQogICAgaWYgKCEoYmFycmVfbmJjb2xvbmVzLnZhbHVlID09IDAgfHwgYmFycmVfbmJyYW5ncy52YWx1ZSA9PSAwKSkgew0KICAgIGJhcnJlX3RhYmxlYXUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpLCBiYXJyZV9uYmNvbG9uZXMudmFsdWUsIGJhcnJlX25icmFuZ3MudmFsdWUsDQogICAgYmFycmVfZG9lbnRldGUuY2hlY2tlZCwgYmFycmVfZG9jYXB0aW9uLmNoZWNrZWQpOyB9ICIgLz4gDQo8L3RkPjwvdHI+PC90YWJsZT4NCjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXI3JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KIDx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KPHRyPjx0ZD4gDQpBZHJlc3NlJm5ic3A7OiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibGllbl9ub20iIHZhbHVlPSJodHRwOi8vIiBzaXplPSIyMSIgbWF4bGVuZ3RoPSIyNTUiIC8+PGJyIC8+DQpCdWxsZSBkJ2FpZGUmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX2J1bGxlIiB2YWx1ZT0iIiBzaXplPSIyMSIgbWF4bGVuZ3RoPSIyNTUiIC8+DQo8L3RkPjx0ZD4NCkxhbmd1ZSBhYnImZWFjdXRlO2cmZWFjdXRlO2UmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX2xhbmd1ZSIgdmFsdWU9IiIgc2l6ZT0iMTAiIG1heGxlbmd0aD0iMTAiIC8+DQo8L3RkPjx0ZD4NCiAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfZGVtYW5kZV9saWVuKCdbJywgJy0+JywgJ10nLCBsaWVuX25vbS52YWx1ZSwgbGllbl9idWxsZS52YWx1ZSwgbGllbl9sYW5ndWUudmFsdWUsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKTsiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+DQo8ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyOCcgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID4NCjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KICA8dHI+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyB0ZXh0LWFsaWduOmNlbnRlcjsiPjxzdHJvbmc+R2VzdGlvbiBkZXMgYW5jcmVzPC9zdHJvbmc+PC90ZD4NCiAgICA8dGQgc3R5bGU9IndpZHRoOmF1dG87Ij48c3Ryb25nPlRyYW5zZm9ybWVyIGVuIGFuY3JlPC9zdHJvbmc+PGJyIC8+DQogICAgPGxhYmVsIGZvcj0iYW5jcmVfbm9tIj48aT5Ob20gZGUgbCdhbmNyZTwvaT48L2xhYmVsPiA8YnIgLz4NCiAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9ub20iIGlkPSJhbmNyZV9ub20iIC8+DQoJICANCgk8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9hbmNyZSgnWycsICc8LScsICddJywgYW5jcmVfbm9tLnZhbHVlLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpOyIgLz4NCiAgICA8L3RkPg0KCTx0ZCBzdHlsZT0id2lkdGg6YXV0bzsiPjxzdHJvbmc+UG9pbnRlciB2ZXJzIHVuZSBhbmNyZTwvc3Ryb25nPjxiciAvPg0KICAgIDxsYWJlbCBmb3I9ImFuY3JlX2NpYmxlIj48aT5BbmNyZSBjaWJsZTwvaT48L2xhYmVsPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYW5jcmVfY2libGUiIGlkPSJhbmNyZV9jaWJsZSIgLz48YnIgLz4NCgk8bGFiZWwgZm9yPSJhbmNyZV9idWxsZSI+PGk+QnVsbGUgZCdhaWRlIGFuY3JlPC9pPjwvbGFiZWw+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9idWxsZSIgaWQ9ImFuY3JlX2J1bGxlIiAvPg0KCTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIiBvbmNsaWNrPSJqYXZhc2NyaXB0OmJhcnJlX2RlbWFuZGUoJ1snLCAnLT4jJywgJ10nLCBhbmNyZV9jaWJsZS52YWx1ZSwgYW5jcmVfYnVsbGUudmFsdWUsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSk7IiAvPiANCjwvdGQ+DQogIDwvdHI+IA0KPC90YWJsZT48ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyOScgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID4NCjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KICA8dHIgY2xhc3M9InNwaXBfYmFycmUiPg0KICAgIDx0ZCBzdHlsZT0id2lkdGg6MzAlOyI+Q2FyYWN0JmVncmF2ZTtyZXMgc3AmZWFjdXRlO2NpYXV4PC90ZD4NCiAgICA8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ1x1MDBhYn4nLCd+XHUwMGJiJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iRW50b3VyZXIgZGUgJmxhcXVvOyBndWlsbGVtZXRzICZyYXF1bzsiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnRW50b3VyZXIgZGUgJmxhcXVvOyBndWlsbGVtZXRzICZyYXF1bzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZ3VpbGxlbWV0cy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJFbnRvdXJlciBkZSAmbGFxdW87IGd1aWxsZW1ldHMgJnJhcXVvOyIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ1x1MDA5MycsJ1x1MDA5NCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkVudG91cmVyIGRlICZsZHF1bztndWlsbGVtZXRzIGRlIHNlY29uZCBuaXZlYXUmcmRxdW87IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0VudG91cmVyIGRlICZsZHF1bztndWlsbGVtZXRzIGRlIHNlY29uZCBuaXZlYXUmcmRxdW87Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2d1aWxsZW1ldHMtc2ltcGxlcy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJFbnRvdXJlciBkZSAmbGRxdW87Z3VpbGxlbWV0cyBkZSBzZWNvbmQgbml2ZWF1JnJkcXVvOyIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzAnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBBIGFjY2VudCBncmF2ZSBtYWp1c2N1bGUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gQSBhY2NlbnQgZ3JhdmUgbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FncmF2ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gQSBhY2NlbnQgZ3JhdmUgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjOScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgYWNjZW50IGFpZ3UgbWFqdXNjdWxlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEUgYWNjZW50IGFpZ3UgbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2VhY3V0ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBhY2NlbnQgYWlndSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM4Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBtYWp1c2N1bGUgYWNjZW50IGdyYXZlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEUgbWFqdXNjdWxlIGFjY2VudCBncmF2ZScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9lYWdyYXZlLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIG1hanVzY3VsZSBhY2NlbnQgZ3JhdmUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGU2Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbFwnQScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9hZWxpZy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjNicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EgbWFqdXNjdWxlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsXCdBIG1hanVzY3VsZScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9hZWxpZy1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignJm9lbGlnOycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ08iIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGxcJ08nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvb2VsaWcucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCcmT0VsaWc7Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyBtYWp1c2N1bGUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGxcJ08gbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL29lbGlnLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzcnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBDIGMmZWFjdXRlO2RpbGxlIG1hanVzY3VsZSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBDIGMmZWFjdXRlO2RpbGxlIG1hanVzY3VsZScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9jY2VkaWwtbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEMgYyZlYWN1dGU7ZGlsbGUgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJyZldXJvOycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIGxlIHN5bWJvbGUgJmV1cm87IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIGxlIHN5bWJvbGUgJmV1cm87Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2V1cm8ucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgbGUgc3ltYm9sZSAmZXVybzsiIC8+PC9hPiZuYnNwOw0KICAgIDwvdGQ+DQogIDwvdHI+IA0KPC90YWJsZT4NCjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXIxMCcgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID4NCjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KPHRyPjx0ZCBzdHlsZT0id2lkdGg6IDI1JTsiPkNoZXJjaGVyPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX2NoZXJjaGVyIiB2YWx1ZT0iIiBzaXplPSIxMiIgbWF4bGVuZ3RoPSIyNTUiIC8+PC90ZD48dGQgc3R5bGU9IndpZHRoOiAyMCU7Ij4NCjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjX2Nhc2UiIHZhbHVlPSJ5ZXMiIC8+UmVzcGVjdGVyIGxhIGNhc3NlPGJyIC8+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZWNfZW50aWVyIiB2YWx1ZT0ieWVzIiAvPg0KTW90IGVudGllcg0KPC90ZD48dGQgIHN0eWxlPSJ3aWR0aDogMjUlOyI+UmVtcGxhY2VyPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX3JlbXBsYWNlciIgdmFsdWU9IiIgc2l6ZT0iMTIiIG1heGxlbmd0aD0iMjU1IiAvPiANCjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMjAlOyI+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY190b3V0IiB2YWx1ZT0ieWVzIiAvPlRvdXQgcmVtcGxhY2VyPC90ZD48dGQgc3R5bGU9IndpZHRoOiAxMCU7Ij4NCiAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIg0KICBvbmNsaWNrPSJqYXZhc2NyaXB0OmJhcnJlX3NlYXJjaHJlcGxhY2UoZG9jdW1lbnQuZm9ybXVsYWlyZS5iYXJyZV9jaGVyY2hlci52YWx1ZSwgZG9jdW1lbnQuZm9ybXVsYWlyZS5iYXJyZV9yZW1wbGFjZXIudmFsdWUsIGRvY3VtZW50LmZvcm11bGFpcmUucmVjX3RvdXQuY2hlY2tlZCwgZG9jdW1lbnQuZm9ybXVsYWlyZS5yZWNfY2FzZS5jaGVja2VkLCBkb2N1bWVudC5mb3JtdWxhaXJlLnJlY19lbnRpZXIuY2hlY2tlZCxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpOyIgLz4gDQo8L3RkPjwvdHI+PC90YWJsZT48ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PgoJPHRleHRhcmVhIG5hbWU9J3RleHRlXzInIHJvd3M9JzEwJyBjbGFzcz0nZm9ybWwgICAnIGNvbHM9JzgwJwoJaWQ9J2lucHV0LTEtdGV4dGVfMicKCW9uc2VsZWN0PSdzdG9yZUNhcmV0KHRoaXMpOycKCW9uY2xpY2s9J3N0b3JlQ2FyZXQodGhpcyk7JwoJb25rZXl1cD0nc3RvcmVDYXJldCh0aGlzKTsnCglvbmRibGNsaWNrPSdzdG9yZUNhcmV0KHRoaXMpOyc+PC90ZXh0YXJlYT4KCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCTxzcGFuIGNsYXNzPSduZXR0b3lldXInPiA8L3NwYW4+CgkJCQoJCTwvZGl2PgoJCgoKIAoJPC9maWVsZHNldD4KCiAKIAoJCgk8cCBzdHlsZT0nZGlzcGxheTpub25lOyc+PGxhYmVsIGZvcj0ibm9ib3Rub2JvdC0xIj5WZXVpbGxleiBsYWlzc2VyIGNlIGNoYW1wIHZpZGUmbmJzcDs6PC9sYWJlbD4KCTxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJub2JvdG5vYm90IiBpZD0ibm9ib3Rub2JvdC0xIiB2YWx1ZT0iIiBzaXplPSIxMCIgLz48L3A+CgkKCTxkaXYgc3R5bGU9J3RleHQtYWxpZ246cmlnaHQnIGNsYXNzPSdzcGlwX2JvdXRvbic+PGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0nVmFsaWRlcicgdmFsdWU9IlZhbGlkZXIiIC8+PC9kaXY+CgoKPHNjcmlwdCBzcmM9Imh0dHA6Ly9wcmVwcm9kLm5vdHJlLXZpbGxlLm5ldC9+c3RzZWIvcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvZm9ybXMvamF2YXNjcmlwdC9qdGlwLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwhLS0KJCgnaW5wdXQuZm9ybW8nKS5iaW5kKCdmb2N1cycsZnVuY3Rpb24oKXskKHRoaXMpLnJlbW92ZUNsYXNzKCdmb3JtbycpLmFkZENsYXNzKCdmb3Jtby1mb2N1cycpO30pOwokKCdpbnB1dC5mb3JtbycpLmJpbmQoJ2JsdXInLGZ1bmN0aW9uKCl7JCh0aGlzKS5yZW1vdmVDbGFzcygnZm9ybW8tZm9jdXMnKS5hZGRDbGFzcygnZm9ybW8nKTt9KTsKJCgnaW5wdXQuZm9ybWwnKS5iaW5kKCdmb2N1cycsZnVuY3Rpb24oKXskKHRoaXMpLnJlbW92ZUNsYXNzKCdmb3JtbCcpLmFkZENsYXNzKCdmb3JtbC1mb2N1cycpO30pOwokKCdpbnB1dC5mb3JtbCcpLmJpbmQoJ2JsdXInLGZ1bmN0aW9uKCl7JCh0aGlzKS5yZW1vdmVDbGFzcygnZm9ybWwtZm9jdXMnKS5hZGRDbGFzcygnZm9ybWwnKTt9KTsKCi8vLS0+PC9zY3JpcHQ+CgoJIAoJPC9mb3JtPgoJCgkKCQoKCjwvZGl2Pg==" ></div>',
212
-				'attribut' => 'title',
213
-			],
214
-			'base64 #2' => [
215
-				'expected' => 'bW9kZWxlIDogYTo3OntzOjQ6JnF1b3Q7bGFuZyZxdW90OztzOjI6JnF1b3Q7ZnImcXVvdDs7czo0OiZxdW90O2ZvbmQmcXVvdDs7czoxMjomcXVvdDttb2RlbGVzL2Zvcm0mcXVvdDs7czoxMDomcXVvdDtkaXJfcmFjaW5lJnF1b3Q7O3M6MzomcXVvdDsuLi8mcXVvdDs7czoyOiZxdW90O2lkJnF1b3Q7O3M6MTomcXVvdDsxJnF1b3Q7O3M6NzomcXVvdDtpZF9mb3JtJnF1b3Q7O3M6MTomcXVvdDsxJnF1b3Q7O3M6NDomcXVvdDtkYXRlJnF1b3Q7O3M6MTk6JnF1b3Q7MjAwNy0wNS0xMSAxMTo0MjoxOSZxdW90OztzOjEwOiZxdW90O2RhdGVfcmVkYWMmcXVvdDs7czoxOTomcXVvdDsyMDA3LTA1LTExIDExOjQyOjE5JnF1b3Q7O30KCmljaXRvdG8KCjxhIG5hbWU9J2Zvcm0xJz48L2E+CjxkaXYgY2xhc3M9J3NwaXBfZm9ybXMnPgoKPGRpdiBjbGFzcz0nc3BpcF9kZXNjcmlwdGlmJz48L2Rpdj4KCgoKCiAKCQkKCQk8ZGl2PgoJCQo8aW5wdXQgbmFtZT0nZXhlYycgdmFsdWU9J2FydGljbGVzJyB0eXBlPSdoaWRkZW4nIC8+CjxpbnB1dCBuYW1lPSdpZF9hcnRpY2xlJyB2YWx1ZT0nOCcgdHlwZT0naGlkZGVuJyAvPgoJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2Fqb3V0X3JlcG9uc2UnIHZhbHVlPScxJyAvPgoJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2lkX2Rvbm5lZScgdmFsdWU9Jy0xMCcgLz4KCQkKCQk8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdyZXRvdXJfZm9ybScgdmFsdWU9JycgLz4KCQkKCQk8L2Rpdj4KCQkJCgoKIAoJIAoJCQoJCSA8ZmllbGRzZXQ+PGxlZ2VuZD5Ob3VzIGNvbnRhY3RlcjwvbGVnZW5kPiAKCQoJIAoJCTxkaXYgY2xhc3M9J3NwaXBfZm9ybV9jaGFtcCBsaWduZV8xJz4KCQkJCgkJCSAKCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWwnPgoJCQkJCSA8bGFiZWwgZm9yPSJpbnB1dC0xLWxpZ25lXzEiPlZvdHJlIE5vbTwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCSAKCQkJCQoJCQkJPGlucHV0IHR5cGU9InRleHRlIiBuYW1lPSdsaWduZV8xJyBpZD0naW5wdXQtMS1saWduZV8xJyB2YWx1ZT0iIiAKCQkJCQkJY2xhc3M9JyAgbGlnbmUgZm9ybWwnIAoJCQkJCQlzaXplPSc0MCcgLz4KCQkJCQoJCQkJCgkJCQkKCQkJCTxzcGFuIGNsYXNzPSduZXR0b3lldXInPiA8L3NwYW4+CgkJCQoJCTwvZGl2PgoJCgoKCiAKCSAKCQkKCQkKCQoJIAoJCTxkaXYgY2xhc3M9J3NwaXBfZm9ybV9jaGFtcCBsaWduZV8yJz4KCQkJCgkJCSAKCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWwnPgoJCQkJCSA8bGFiZWwgZm9yPSJpbnB1dC0xLWxpZ25lXzIiPlZvdHJlIFByw6lub208L2xhYmVsPgoJCQkJCQoJCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWxfb2JsaWdhdG9pcmUnPgoJCQkJCQlbT2JsaWdhdG9pcmVdPC9zcGFuPgoJCQkJCToKCQkJCTwvc3Bhbj4KCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgCgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0ZSIgbmFtZT0nbGlnbmVfMicgaWQ9J2lucHV0LTEtbGlnbmVfMicgdmFsdWU9IiIgCgkJCQkJCWNsYXNzPScgIGxpZ25lIGZvcm1sJyAKCQkJCQkJc2l6ZT0nNDAnIC8+CgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgZW1haWxfMSc+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS1lbWFpbF8xIj5Wb3RyZSBlbWFpbDwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsX2RldGFpbHMnPlZldWlsbGV6IGVudHJlciB1bmUgYWRyZXNzZSBlLW1haWwgdmFsaWRlIChkZSB0eXBlIHZvdXNAZm91cm5pc3NldXIuY29tKS48L3NwYW4+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgCgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0ZSIgbmFtZT0nZW1haWxfMScgaWQ9J2lucHV0LTEtZW1haWxfMScgdmFsdWU9IiIgCgkJCQkJCWNsYXNzPScgIGVtYWlsIGZvcm1sJyAKCQkJCQkJc2l6ZT0nNDAnIC8+CgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgdGV4dGVfMSc+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS10ZXh0ZV8xIj5Wb3RyZSBBZHJlc3NlPC9sYWJlbD4KCQkJCQkKCQkJCQkKCQkJCQk6CgkJCQk8L3NwYW4+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCSAgPGRpdiBjbGFzcz0iYmFzZTY0amF2YXNjcmlwdDYxNjYyMzIzMDQ2NDQzNDk4YmRmMDE5LjMxMDkxNjM1IiB0aXRsZT0nUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaUlITnlZejBpTGk0dmNHeDFaMmx1Y3k5aFpHMXBiaTh0YWxGMVpYSjVMMmx0WjE5d1lXTnJMMnhoZVdWeUxtcHpJajQ4TDNOamNtbHdkRDQ9JyA+PC9kaXY+Cgo8ZGl2IGNsYXNzPSJiYXNlNjRqYXZhc2NyaXB0NjE2NjIzMjMwNDY0NDM0OThiZGYwMTkuMzEwOTE2MzUiIHRpdGxlPSdQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpSUhOeVl6MGlMaTR2Y0d4MVoybHVjeTltYjI1amRHbHZibTVoYkdsMFpYTXZZbUZ5Y21WZmRIbHdiMTlsWTI5c2IyZHBjWFZsTDJwekwzTndhWEJmWW1GeWNtVXVhbk1pUGp3dmMyTnlhWEIwUGc9PScgPjwvZGl2PgoKPHRhYmxlIGNsYXNzPSdzcGlwX2JhcnJlJyBzdHlsZT0nd2lkdGg6YXV0bzsnIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCcgYm9yZGVyPScwJyBzdW1tYXJ5PScnPgo8dHIgc3R5bGU9J3dpZHRoOiBhdXRvOycgY2xhc3M9J3NwaXBfYmFycmUnPgo8dGQgc3R5bGU9J3RleHQtYWxpZ246IGxlZnQ7JyB2YWxpZ249J21pZGRsZSc+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ3snLCd9Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGVuIHtpdGFsaXF1ZX0iPjxpbWcgc3JjPSdpbWdfcGFjay9pY29uZXNfYmFycmUvaXRhbGlxdWUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGVuIHtpdGFsaXF1ZX0iIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCd7eycsJ319Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGVuIHt7Z3Jhc319Ij48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2dyYXMucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGVuIHt7Z3Jhc319IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnWyonLCcqXScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBsZSB0ZXh0ZSBlbiBbKiZlYWN1dGU7dmlkZW5jZSpdIj48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9taXNlZW5ldmlkZW5jZS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJNZXR0cmUgbGUgdGV4dGUgZW4gWyomZWFjdXRlO3ZpZGVuY2UqXSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJyUzQ3N1cCUzRScsJyUzQy9zdXAlM0UnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJNZXR0cmUgbGUgdGV4dGUgZW4gJmx0O3N1cCZndDtleHBvc2FudCZsdDsvc3VwJmd0OyI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZXhwb3NhbnQucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGxlIHRleHRlIGVuICZsdDtzdXAmZ3Q7ZXhwb3NhbnQmbHQ7L3N1cCZndDsiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCclM0NzYyUzRScsJyUzQy9zYyUzRScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBsZSB0ZXh0ZSBlbiAmbHQ7c2MmZ3Q7cGV0aXRlcyBjYXBpdGFsZXMmbHQ7L3NjJmd0OyI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvcGV0aXRlc2NhcGl0YWxlcy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJNZXR0cmUgbGUgdGV4dGUgZW4gJmx0O3NjJmd0O3BldGl0ZXMgY2FwaXRhbGVzJmx0Oy9zYyZndDsiIC8+PC9hPiZuYnNwOzwvdGQ+Cjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCcxMScsJycpOyIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IlRyYW5zZm9ybWVyIGVuIFtsaWVuIGh5cGVydGV4dGUtPmh0dHA6Ly8uLi5dIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2xpZW4ucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iVHJhbnNmb3JtZXIgZW4gW2xpZW4gaHlwZXJ0ZXh0ZS0+aHR0cDovLy4uLl0iIC8+PC9hPiZuYnNwOzwvdGQ+Cjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnJTVDbiU1Q24lM0NxdW90ZSUzRScsJyUzQy9xdW90ZSUzRSU1Q24lNUNuJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iQ2l0ZXIgdW4gbWVzc2FnZSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9xdW90ZS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJDaXRlciB1biBtZXNzYWdlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnWz8nLCddJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iRW50ciZlYWN1dGU7ZSBkdSBbP2dsb3NzYWlyZV0gKFdpa2lwZWRpYSkiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2JhcnJlLXdpa2kucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iRW50ciZlYWN1dGU7ZSBkdSBbP2dsb3NzYWlyZV0gKFdpa2lwZWRpYSkiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6c3dhcF9jb3VjaGUoJzEwJywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gdGFibGVhdSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvYmFycmUtdGFibGVhdS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biB0YWJsZWF1IiAvPjwvYT4mbmJzcDwvdGQ+Cjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCcxNCcsJycpOyIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkNoZXJjaGVyIFJlbXBsYWNlciI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvY2hlcmNoZXJfcmVtcGxhY2VyLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkNoZXJjaGVyIFJlbXBsYWNlciIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnMTInLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJHZXN0aW9uIGRlcyBhbmNyZXMiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FuY3JlLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ikdlc3Rpb24gZGVzIGFuY3JlcyIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOmxlZnQ7JyB2YWxpZ249J21pZGRsZSc+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnMTMnLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJDYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXgiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2NsYXZpZXIucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iQ2FyYWN0JmVncmF2ZTtyZXMgc3AmZWFjdXRlO2NpYXV4IiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQgc3R5bGU9J3RleHQtYWxpZ246cmlnaHQ7JyB2YWxpZ249J21pZGRsZSc+Jm5ic3A7Jm5ic3A7PGEgY2xhc3M9J2FpZGUnIGhyZWY9J2h0dHA6Ly9wcmVwcm9kLm5vdHJlLXZpbGxlLm5ldC9+c3RzZWIvZWNyaXJlLz9leGVjPWFpZGVfaW5kZXgmYW1wO2FpZGU9cmFjY291cmNpcyZhbXA7dmFyX2xhbmc9ZnInIHRhcmdldD0ic3BpcF9haWRlIiBvbmNsaWNrPSJqYXZhc2NyaXB0OndpbmRvdy5vcGVuKHRoaXMuaHJlZiwnc3BpcF9haWRlJywgJ3Njcm9sbGJhcnM9eWVzLCByZXNpemFibGU9eWVzLCB3aWR0aD03NDAsIGhlaWdodD01ODAnKTsgcmV0dXJuIGZhbHNlOyI+PGltZyBzcmM9J2ltZ19wYWNrL2FpZGUuZ2lmJwphbHQ9IkFJREUiIHRpdGxlPSJEZSBsJ2FpZGUgc3VyIGNldCAmZWFjdXRlO2wmZWFjdXRlO21lbnQiIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgYWxpZ249Im1pZGRsZSIgLz48L2E+Jm5ic3A7PC90ZD48L3RyPjwvdGFibGU+PGRpdiBpZD0nTGF5ZXIxMCcgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID48dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCjx0cj48dGQ+DQpOYiBjb2xvbm5lczogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX25iY29sb25lcyIgc3R5bGU9IndpZHRoOiAzMHB4OyIgdmFsdWU9IjIiIHNpemU9IjIiIG1heGxlbmd0aD0iMiIgICAvPjwvdGQ+PHRkPg0KTmIgbGlnbmVzOiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYmFycmVfbmJyYW5ncyIgc3R5bGU9IndpZHRoOiAzMHB4OyIgdmFsdWU9IjIiIHNpemU9IjIiIG1heGxlbmd0aD0iMiIgLz48L3RkPjx0ZD4NCjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iYmFycmVfZG9lbnRldGUiIHZhbHVlPSItMSIgY2hlY2tlZD0iY2hlY2tlZCIgLz4gRW50ZXRlPC90ZD48dGQ+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImJhcnJlX2RvY2FwdGlvbiIgdmFsdWU9Ii0xIiBjaGVja2VkPSJjaGVja2VkIiAvPiBDYXB0aW9uIGV0IFImZWFjdXRlO3N1bSZlYWN1dGU7PC90ZD48dGQ+DQogIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIiBvbmNsaWNrPSJqYXZhc2NyaXB0Og0KICAgIGJhcnJlX25iY29sb25lcy52YWx1ZSA9IE1hdGguYWJzKGJhcnJlX25iY29sb25lcy52YWx1ZSk7IGJhcnJlX25icmFuZ3MudmFsdWUNCiAgICA9IE1hdGguYWJzKGJhcnJlX25icmFuZ3MudmFsdWUpOw0KICAgIGlmICghKGJhcnJlX25iY29sb25lcy52YWx1ZSA9PSAwIHx8IGJhcnJlX25icmFuZ3MudmFsdWUgPT0gMCkpIHsNCiAgICBiYXJyZV90YWJsZWF1KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSwgYmFycmVfbmJjb2xvbmVzLnZhbHVlLCBiYXJyZV9uYnJhbmdzLnZhbHVlLA0KICAgIGJhcnJlX2RvZW50ZXRlLmNoZWNrZWQsIGJhcnJlX2RvY2FwdGlvbi5jaGVja2VkKTsgfSAiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+DQo8ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyMTEnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQogPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkPiANCkFkcmVzc2UmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX25vbSIgdmFsdWU9Imh0dHA6Ly8iIHNpemU9IjIxIiBtYXhsZW5ndGg9IjI1NSIgLz48YnIgLz4NCkJ1bGxlIGQnYWlkZSZuYnNwOzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxpZW5fYnVsbGUiIHZhbHVlPSIiIHNpemU9IjIxIiBtYXhsZW5ndGg9IjI1NSIgLz4NCjwvdGQ+PHRkPg0KTGFuZ3VlIGFiciZlYWN1dGU7ZyZlYWN1dGU7ZSZuYnNwOzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxpZW5fbGFuZ3VlIiB2YWx1ZT0iIiBzaXplPSIxMCIgbWF4bGVuZ3RoPSIxMCIgLz4NCjwvdGQ+PHRkPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9kZW1hbmRlX2xpZW4oJ1snLCAnLT4nLCAnXScsIGxpZW5fbm9tLnZhbHVlLCBsaWVuX2J1bGxlLnZhbHVlLCBsaWVuX2xhbmd1ZS52YWx1ZSxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpOyIgLz4gDQo8L3RkPjwvdHI+PC90YWJsZT4NCjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXIxMicgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID4NCjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KICA8dHI+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyB0ZXh0LWFsaWduOmNlbnRlcjsiPjxzdHJvbmc+R2VzdGlvbiBkZXMgYW5jcmVzPC9zdHJvbmc+PC90ZD4NCiAgICA8dGQgc3R5bGU9IndpZHRoOmF1dG87Ij48c3Ryb25nPlRyYW5zZm9ybWVyIGVuIGFuY3JlPC9zdHJvbmc+PGJyIC8+DQogICAgPGxhYmVsIGZvcj0iYW5jcmVfbm9tIj48aT5Ob20gZGUgbCdhbmNyZTwvaT48L2xhYmVsPiA8YnIgLz4NCiAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9ub20iIGlkPSJhbmNyZV9ub20iIC8+DQoJICANCgk8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9hbmNyZSgnWycsICc8LScsICddJywgYW5jcmVfbm9tLnZhbHVlLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpOyIgLz4NCiAgICA8L3RkPg0KCTx0ZCBzdHlsZT0id2lkdGg6YXV0bzsiPjxzdHJvbmc+UG9pbnRlciB2ZXJzIHVuZSBhbmNyZTwvc3Ryb25nPjxiciAvPg0KICAgIDxsYWJlbCBmb3I9ImFuY3JlX2NpYmxlIj48aT5BbmNyZSBjaWJsZTwvaT48L2xhYmVsPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYW5jcmVfY2libGUiIGlkPSJhbmNyZV9jaWJsZSIgLz48YnIgLz4NCgk8bGFiZWwgZm9yPSJhbmNyZV9idWxsZSI+PGk+QnVsbGUgZCdhaWRlIGFuY3JlPC9pPjwvbGFiZWw+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9idWxsZSIgaWQ9ImFuY3JlX2J1bGxlIiAvPg0KCTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIiBvbmNsaWNrPSJqYXZhc2NyaXB0OmJhcnJlX2RlbWFuZGUoJ1snLCAnLT4jJywgJ10nLCBhbmNyZV9jaWJsZS52YWx1ZSwgYW5jcmVfYnVsbGUudmFsdWUsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSk7IiAvPiANCjwvdGQ+DQogIDwvdHI+IA0KPC90YWJsZT48ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyMTMnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQo8dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCiAgPHRyIGNsYXNzPSJzcGlwX2JhcnJlIj4NCiAgICA8dGQgc3R5bGU9IndpZHRoOjMwJTsiPkNhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eDwvdGQ+DQogICAgPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCdcdTAwYWJ+Jywnflx1MDBiYicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkVudG91cmVyIGRlICZsYXF1bzsgZ3VpbGxlbWV0cyAmcmFxdW87Ij48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2d1aWxsZW1ldHMucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iRW50b3VyZXIgZGUgJmxhcXVvOyBndWlsbGVtZXRzICZyYXF1bzsiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCdcdTAwOTMnLCdcdTAwOTQnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJFbnRvdXJlciBkZSAmbGRxdW87Z3VpbGxlbWV0cyBkZSBzZWNvbmQgbml2ZWF1JnJkcXVvOyI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9ndWlsbGVtZXRzLXNpbXBsZXMucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iRW50b3VyZXIgZGUgJmxkcXVvO2d1aWxsZW1ldHMgZGUgc2Vjb25kIG5pdmVhdSZyZHF1bzsiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGMwJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gQSBhY2NlbnQgZ3JhdmUgbWFqdXNjdWxlIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2FncmF2ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gQSBhY2NlbnQgZ3JhdmUgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjOScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgYWNjZW50IGFpZ3UgbWFqdXNjdWxlIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2VhY3V0ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBhY2NlbnQgYWlndSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM4Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBtYWp1c2N1bGUgYWNjZW50IGdyYXZlIj48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9lYWdyYXZlLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIG1hanVzY3VsZSBhY2NlbnQgZ3JhdmUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGU2Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvYWVsaWcucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzYnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIG1hanVzY3VsZSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvYWVsaWctbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJyZvZWxpZzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL29lbGlnLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ08iIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignJk9FbGlnOycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ08gbWFqdXNjdWxlIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL29lbGlnLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzcnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBDIGMmZWFjdXRlO2RpbGxlIG1hanVzY3VsZSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvY2NlZGlsLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBDIGMmZWFjdXRlO2RpbGxlIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCcmZXVybzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciBsZSBzeW1ib2xlICZldXJvOyI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9ldXJvLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIGxlIHN5bWJvbGUgJmV1cm87IiAvPjwvYT4mbmJzcDsNCiAgICA8L3RkPg0KICA8L3RyPiANCjwvdGFibGU+DQo8ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyMTQnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQo8dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCjx0cj48dGQgc3R5bGU9IndpZHRoOiAyNSU7Ij5DaGVyY2hlcjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9jaGVyY2hlciIgdmFsdWU9IiIgc2l6ZT0iMTIiIG1heGxlbmd0aD0iMjU1IiAvPjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMjAlOyI+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY19jYXNlIiB2YWx1ZT0ieWVzIiAvPlJlc3BlY3RlciBsYSBjYXNzZTxiciAvPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjX2VudGllciIgdmFsdWU9InllcyIgLz4NCk1vdCBlbnRpZXINCjwvdGQ+PHRkICBzdHlsZT0id2lkdGg6IDI1JTsiPlJlbXBsYWNlcjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9yZW1wbGFjZXIiIHZhbHVlPSIiIHNpemU9IjEyIiBtYXhsZW5ndGg9IjI1NSIgLz4gDQo8L3RkPjx0ZCBzdHlsZT0id2lkdGg6IDIwJTsiPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZWNfdG91dCIgdmFsdWU9InllcyIgLz5Ub3V0IHJlbXBsYWNlcjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMTAlOyI+DQogICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyINCiAgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9zZWFyY2hyZXBsYWNlKGRvY3VtZW50LmZvcm11bGFpcmUuYmFycmVfY2hlcmNoZXIudmFsdWUsIGRvY3VtZW50LmZvcm11bGFpcmUuYmFycmVfcmVtcGxhY2VyLnZhbHVlLCBkb2N1bWVudC5mb3JtdWxhaXJlLnJlY190b3V0LmNoZWNrZWQsIGRvY3VtZW50LmZvcm11bGFpcmUucmVjX2Nhc2UuY2hlY2tlZCwgZG9jdW1lbnQuZm9ybXVsYWlyZS5yZWNfZW50aWVyLmNoZWNrZWQsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKTsiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+PGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj4KCTx0ZXh0YXJlYSBuYW1lPSd0ZXh0ZV8xJyByb3dzPScxMCcgY2xhc3M9J2Zvcm1vICAgJyBjb2xzPSc4MCcKCWlkPSdpbnB1dC0xLXRleHRlXzEnCglvbnNlbGVjdD0nc3RvcmVDYXJldCh0aGlzKTsnCglvbmNsaWNrPSdzdG9yZUNhcmV0KHRoaXMpOycKCW9ua2V5dXA9J3N0b3JlQ2FyZXQodGhpcyk7JwoJb25kYmxjbGljaz0nc3RvcmVDYXJldCh0aGlzKTsnPjwvdGV4dGFyZWE+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgdGV4dGVfMic+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS10ZXh0ZV8yIj5Wb3RyZSBRdWVzdGlvbjwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgIDx0YWJsZSBjbGFzcz0nc3BpcF9iYXJyZScgc3R5bGU9J3dpZHRoOmF1dG87JyBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnIGJvcmRlcj0nMCcgc3VtbWFyeT0nJz4KPHRyIHN0eWxlPSd3aWR0aDogYXV0bzsnIGNsYXNzPSdzcGlwX2JhcnJlJz4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOiBsZWZ0OycgdmFsaWduPSdtaWRkbGUnPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCd7JywnfScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBlbiB7aXRhbGlxdWV9Ij48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2l0YWxpcXVlLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBlbiB7aXRhbGlxdWV9IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgne3snLCd9fScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBlbiB7e2dyYXN9fSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9ncmFzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBlbiB7e2dyYXN9fSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ1sqJywnKl0nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJNZXR0cmUgbGUgdGV4dGUgZW4gWyomZWFjdXRlO3ZpZGVuY2UqXSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvbWlzZWVuZXZpZGVuY2UucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGxlIHRleHRlIGVuIFsqJmVhY3V0ZTt2aWRlbmNlKl0iIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCclM0NzdXAlM0UnLCclM0Mvc3VwJTNFJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGxlIHRleHRlIGVuICZsdDtzdXAmZ3Q7ZXhwb3NhbnQmbHQ7L3N1cCZndDsiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2V4cG9zYW50LnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBsZSB0ZXh0ZSBlbiAmbHQ7c3VwJmd0O2V4cG9zYW50Jmx0Oy9zdXAmZ3Q7IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnJTNDc2MlM0UnLCclM0Mvc2MlM0UnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJNZXR0cmUgbGUgdGV4dGUgZW4gJmx0O3NjJmd0O3BldGl0ZXMgY2FwaXRhbGVzJmx0Oy9zYyZndDsiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL3BldGl0ZXNjYXBpdGFsZXMucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGxlIHRleHRlIGVuICZsdDtzYyZndDtwZXRpdGVzIGNhcGl0YWxlcyZsdDsvc2MmZ3Q7IiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnMTYnLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJUcmFuc2Zvcm1lciBlbiBbbGllbiBoeXBlcnRleHRlLT5odHRwOi8vLi4uXSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9saWVuLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IlRyYW5zZm9ybWVyIGVuIFtsaWVuIGh5cGVydGV4dGUtPmh0dHA6Ly8uLi5dIiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJyU1Q24lNUNuJTNDcXVvdGUlM0UnLCclM0MvcXVvdGUlM0UlNUNuJTVDbicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkNpdGVyIHVuIG1lc3NhZ2UiPjxpbWcgc3JjPSdpbWdfcGFjay9pY29uZXNfYmFycmUvcXVvdGUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iQ2l0ZXIgdW4gbWVzc2FnZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ1s/JywnXScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkVudHImZWFjdXRlO2UgZHUgWz9nbG9zc2FpcmVdIChXaWtpcGVkaWEpIj48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9iYXJyZS13aWtpLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudHImZWFjdXRlO2UgZHUgWz9nbG9zc2FpcmVdIChXaWtpcGVkaWEpIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCcxNScsJycpOyIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIHRhYmxlYXUiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2JhcnJlLXRhYmxlYXUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gdGFibGVhdSIgLz48L2E+Jm5ic3A8L3RkPgo8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnMTknLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJDaGVyY2hlciBSZW1wbGFjZXIiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2NoZXJjaGVyX3JlbXBsYWNlci5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJDaGVyY2hlciBSZW1wbGFjZXIiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6c3dhcF9jb3VjaGUoJzE3JywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iR2VzdGlvbiBkZXMgYW5jcmVzIj48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9hbmNyZS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJHZXN0aW9uIGRlcyBhbmNyZXMiIC8+PC9hPiZuYnNwOzwvdGQ+Cjx0ZCBzdHlsZT0ndGV4dC1hbGlnbjpsZWZ0OycgdmFsaWduPSdtaWRkbGUnPjxhIGhyZWY9ImphdmFzY3JpcHQ6c3dhcF9jb3VjaGUoJzE4JywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iQ2FyYWN0JmVncmF2ZTtyZXMgc3AmZWFjdXRlO2NpYXV4Ij48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9jbGF2aWVyLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkNhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eCIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOnJpZ2h0OycgdmFsaWduPSdtaWRkbGUnPiZuYnNwOyZuYnNwOzxhIGNsYXNzPSdhaWRlJyBocmVmPSdodHRwOi8vcHJlcHJvZC5ub3RyZS12aWxsZS5uZXQvfnN0c2ViL2VjcmlyZS8/ZXhlYz1haWRlX2luZGV4JmFtcDthaWRlPXJhY2NvdXJjaXMmYW1wO3Zhcl9sYW5nPWZyJyB0YXJnZXQ9InNwaXBfYWlkZSIgb25jbGljaz0iamF2YXNjcmlwdDp3aW5kb3cub3Blbih0aGlzLmhyZWYsJ3NwaXBfYWlkZScsICdzY3JvbGxiYXJzPXllcywgcmVzaXphYmxlPXllcywgd2lkdGg9NzQwLCBoZWlnaHQ9NTgwJyk7IHJldHVybiBmYWxzZTsiPjxpbWcgc3JjPSdpbWdfcGFjay9haWRlLmdpZicKYWx0PSJBSURFIiB0aXRsZT0iRGUgbCdhaWRlIHN1ciBjZXQgJmVhY3V0ZTtsJmVhY3V0ZTttZW50IiB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIGFsaWduPSJtaWRkbGUiIC8+PC9hPiZuYnNwOzwvdGQ+PC90cj48L3RhYmxlPjxkaXYgaWQ9J0xheWVyMTUnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+PHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkPg0KTmIgY29sb25uZXM6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9uYmNvbG9uZXMiIHN0eWxlPSJ3aWR0aDogMzBweDsiIHZhbHVlPSIyIiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiICAgLz48L3RkPjx0ZD4NCk5iIGxpZ25lczogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX25icmFuZ3MiIHN0eWxlPSJ3aWR0aDogMzBweDsiIHZhbHVlPSIyIiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiIC8+PC90ZD48dGQ+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImJhcnJlX2RvZW50ZXRlIiB2YWx1ZT0iLTEiIGNoZWNrZWQ9ImNoZWNrZWQiIC8+IEVudGV0ZTwvdGQ+PHRkPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJiYXJyZV9kb2NhcHRpb24iIHZhbHVlPSItMSIgY2hlY2tlZD0iY2hlY2tlZCIgLz4gQ2FwdGlvbiBldCBSJmVhY3V0ZTtzdW0mZWFjdXRlOzwvdGQ+PHRkPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDoNCiAgICBiYXJyZV9uYmNvbG9uZXMudmFsdWUgPSBNYXRoLmFicyhiYXJyZV9uYmNvbG9uZXMudmFsdWUpOyBiYXJyZV9uYnJhbmdzLnZhbHVlDQogICAgPSBNYXRoLmFicyhiYXJyZV9uYnJhbmdzLnZhbHVlKTsNCiAgICBpZiAoIShiYXJyZV9uYmNvbG9uZXMudmFsdWUgPT0gMCB8fCBiYXJyZV9uYnJhbmdzLnZhbHVlID09IDApKSB7DQogICAgYmFycmVfdGFibGVhdShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJyksIGJhcnJlX25iY29sb25lcy52YWx1ZSwgYmFycmVfbmJyYW5ncy52YWx1ZSwNCiAgICBiYXJyZV9kb2VudGV0ZS5jaGVja2VkLCBiYXJyZV9kb2NhcHRpb24uY2hlY2tlZCk7IH0gIiAvPiANCjwvdGQ+PC90cj48L3RhYmxlPg0KPGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjE2JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KIDx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KPHRyPjx0ZD4gDQpBZHJlc3NlJm5ic3A7OiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibGllbl9ub20iIHZhbHVlPSJodHRwOi8vIiBzaXplPSIyMSIgbWF4bGVuZ3RoPSIyNTUiIC8+PGJyIC8+DQpCdWxsZSBkJ2FpZGUmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX2J1bGxlIiB2YWx1ZT0iIiBzaXplPSIyMSIgbWF4bGVuZ3RoPSIyNTUiIC8+DQo8L3RkPjx0ZD4NCkxhbmd1ZSBhYnImZWFjdXRlO2cmZWFjdXRlO2UmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX2xhbmd1ZSIgdmFsdWU9IiIgc2l6ZT0iMTAiIG1heGxlbmd0aD0iMTAiIC8+DQo8L3RkPjx0ZD4NCiAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfZGVtYW5kZV9saWVuKCdbJywgJy0+JywgJ10nLCBsaWVuX25vbS52YWx1ZSwgbGllbl9idWxsZS52YWx1ZSwgbGllbl9sYW5ndWUudmFsdWUsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKTsiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+DQo8ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyMTcnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQo8dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCiAgPHRyPg0KICAgIDx0ZCBzdHlsZT0id2lkdGg6YXV0bzsgdGV4dC1hbGlnbjpjZW50ZXI7Ij48c3Ryb25nPkdlc3Rpb24gZGVzIGFuY3Jlczwvc3Ryb25nPjwvdGQ+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyI+PHN0cm9uZz5UcmFuc2Zvcm1lciBlbiBhbmNyZTwvc3Ryb25nPjxiciAvPg0KICAgIDxsYWJlbCBmb3I9ImFuY3JlX25vbSI+PGk+Tm9tIGRlIGwnYW5jcmU8L2k+PC9sYWJlbD4gPGJyIC8+DQogICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYW5jcmVfbm9tIiBpZD0iYW5jcmVfbm9tIiAvPg0KCSAgDQoJPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfYW5jcmUoJ1snLCAnPC0nLCAnXScsIGFuY3JlX25vbS52YWx1ZSwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKTsiIC8+DQogICAgPC90ZD4NCgk8dGQgc3R5bGU9IndpZHRoOmF1dG87Ij48c3Ryb25nPlBvaW50ZXIgdmVycyB1bmUgYW5jcmU8L3N0cm9uZz48YnIgLz4NCiAgICA8bGFiZWwgZm9yPSJhbmNyZV9jaWJsZSI+PGk+QW5jcmUgY2libGU8L2k+PC9sYWJlbD4gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImFuY3JlX2NpYmxlIiBpZD0iYW5jcmVfY2libGUiIC8+PGJyIC8+DQoJPGxhYmVsIGZvcj0iYW5jcmVfYnVsbGUiPjxpPkJ1bGxlIGQnYWlkZSBhbmNyZTwvaT48L2xhYmVsPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYW5jcmVfYnVsbGUiIGlkPSJhbmNyZV9idWxsZSIgLz4NCgk8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9kZW1hbmRlKCdbJywgJy0+IycsICddJywgYW5jcmVfY2libGUudmFsdWUsIGFuY3JlX2J1bGxlLnZhbHVlLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpOyIgLz4gDQo8L3RkPg0KICA8L3RyPiANCjwvdGFibGU+PGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjE4JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQogIDx0ciBjbGFzcz0ic3BpcF9iYXJyZSI+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDozMCU7Ij5DYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXg8L3RkPg0KICAgIDx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnXHUwMGFificsJ35cdTAwYmInLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJFbnRvdXJlciBkZSAmbGFxdW87IGd1aWxsZW1ldHMgJnJhcXVvOyI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9ndWlsbGVtZXRzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudG91cmVyIGRlICZsYXF1bzsgZ3VpbGxlbWV0cyAmcmFxdW87IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnXHUwMDkzJywnXHUwMDk0Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iRW50b3VyZXIgZGUgJmxkcXVvO2d1aWxsZW1ldHMgZGUgc2Vjb25kIG5pdmVhdSZyZHF1bzsiPjxpbWcgc3JjPSdpbWdfcGFjay9pY29uZXNfYmFycmUvZ3VpbGxlbWV0cy1zaW1wbGVzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudG91cmVyIGRlICZsZHF1bztndWlsbGVtZXRzIGRlIHNlY29uZCBuaXZlYXUmcmRxdW87IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjMCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEEgYWNjZW50IGdyYXZlIG1hanVzY3VsZSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9hZ3JhdmUtbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEEgYWNjZW50IGdyYXZlIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzknLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGFjY2VudCBhaWd1IG1hanVzY3VsZSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9lYWN1dGUtbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgYWNjZW50IGFpZ3UgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjOCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgbWFqdXNjdWxlIGFjY2VudCBncmF2ZSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZWFncmF2ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBtYWp1c2N1bGUgYWNjZW50IGdyYXZlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBlNicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FlbGlnLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM2Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSBtYWp1c2N1bGUiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FlbGlnLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCcmb2VsaWc7Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9vZWxpZy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJyZPRWxpZzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIG1hanVzY3VsZSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9vZWxpZy1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM3Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gQyBjJmVhY3V0ZTtkaWxsZSBtYWp1c2N1bGUiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2NjZWRpbC1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gQyBjJmVhY3V0ZTtkaWxsZSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignJmV1cm87Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgbGUgc3ltYm9sZSAmZXVybzsiPjxpbWcgc3JjPSdpbWdfcGFjay9pY29uZXNfYmFycmUvZXVyby5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciBsZSBzeW1ib2xlICZldXJvOyIgLz48L2E+Jm5ic3A7DQogICAgPC90ZD4NCiAgPC90cj4gDQo8L3RhYmxlPg0KPGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjE5JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkIHN0eWxlPSJ3aWR0aDogMjUlOyI+Q2hlcmNoZXI8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYmFycmVfY2hlcmNoZXIiIHZhbHVlPSIiIHNpemU9IjEyIiBtYXhsZW5ndGg9IjI1NSIgLz48L3RkPjx0ZCBzdHlsZT0id2lkdGg6IDIwJTsiPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZWNfY2FzZSIgdmFsdWU9InllcyIgLz5SZXNwZWN0ZXIgbGEgY2Fzc2U8YnIgLz48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY19lbnRpZXIiIHZhbHVlPSJ5ZXMiIC8+DQpNb3QgZW50aWVyDQo8L3RkPjx0ZCAgc3R5bGU9IndpZHRoOiAyNSU7Ij5SZW1wbGFjZXI8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYmFycmVfcmVtcGxhY2VyIiB2YWx1ZT0iIiBzaXplPSIxMiIgbWF4bGVuZ3RoPSIyNTUiIC8+IA0KPC90ZD48dGQgc3R5bGU9IndpZHRoOiAyMCU7Ij4NCjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjX3RvdXQiIHZhbHVlPSJ5ZXMiIC8+VG91dCByZW1wbGFjZXI8L3RkPjx0ZCBzdHlsZT0id2lkdGg6IDEwJTsiPg0KICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iDQogIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfc2VhcmNocmVwbGFjZShkb2N1bWVudC5mb3JtdWxhaXJlLmJhcnJlX2NoZXJjaGVyLnZhbHVlLCBkb2N1bWVudC5mb3JtdWxhaXJlLmJhcnJlX3JlbXBsYWNlci52YWx1ZSwgZG9jdW1lbnQuZm9ybXVsYWlyZS5yZWNfdG91dC5jaGVja2VkLCBkb2N1bWVudC5mb3JtdWxhaXJlLnJlY19jYXNlLmNoZWNrZWQsIGRvY3VtZW50LmZvcm11bGFpcmUucmVjX2VudGllci5jaGVja2VkLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSk7IiAvPiANCjwvdGQ+PC90cj48L3RhYmxlPjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+Cgk8dGV4dGFyZWEgbmFtZT0ndGV4dGVfMicgcm93cz0nMTAnIGNsYXNzPSdmb3JtbCAgICcgY29scz0nODAnCglpZD0naW5wdXQtMS10ZXh0ZV8yJwoJb25zZWxlY3Q9J3N0b3JlQ2FyZXQodGhpcyk7JwoJb25jbGljaz0nc3RvcmVDYXJldCh0aGlzKTsnCglvbmtleXVwPSdzdG9yZUNhcmV0KHRoaXMpOycKCW9uZGJsY2xpY2s9J3N0b3JlQ2FyZXQodGhpcyk7Jz48L3RleHRhcmVhPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJPHNwYW4gY2xhc3M9J25ldHRveWV1cic+IDwvc3Bhbj4KCQkJCgkJPC9kaXY+CgkKCgogCgk8L2ZpZWxkc2V0PgoKIAogCgkKCTxwIHN0eWxlPSdkaXNwbGF5Om5vbmU7Jz48bGFiZWwgZm9yPSJub2JvdG5vYm90LTEiPlZldWlsbGV6IGxhaXNzZXIgY2UgY2hhbXAgdmlkZSZuYnNwOzo8L2xhYmVsPgoJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im5vYm90bm9ib3QiIGlkPSJub2JvdG5vYm90LTEiIHZhbHVlPSIiIHNpemU9IjEwIiAvPjwvcD4KCQoJPGRpdiBzdHlsZT0ndGV4dC1hbGlnbjpyaWdodCcgY2xhc3M9J3NwaXBfYm91dG9uJz48aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSdWYWxpZGVyJyB2YWx1ZT0iVmFsaWRlciIgLz48L2Rpdj4KCgo8ZGl2IGNsYXNzPSJiYXNlNjRqYXZhc2NyaXB0NjE2NjIzMjMwNDY0NDM0OThiZGYwMTkuMzEwOTE2MzUiIHRpdGxlPSdQSE5qY21sd2RDQnpjbU05SW1oMGRIQTZMeTl3Y21Wd2NtOWtMbTV2ZEhKbExYWnBiR3hsTG01bGRDOStjM1J6WldJdmNHeDFaMmx1Y3k5bWIyNWpkR2x2Ym01aGJHbDBaWE12Wm05eWJYTXZhbUYyWVhOamNtbHdkQzlxZEdsd0xtcHpJaUIwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBqd3ZjMk55YVhCMFBnPT0nID48L2Rpdj4KCgoKPGRpdiBjbGFzcz0iYmFzZTY0amF2YXNjcmlwdDYxNjYyMzIzMDQ2NDQzNDk4YmRmMDE5LjMxMDkxNjM1IiB0aXRsZT0nUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBqd2hMUzBLSkNnbmFXNXdkWFF1Wm05eWJXOG5LUzVpYVc1a0tDZG1iMk4xY3ljc1puVnVZM1JwYjI0b0tYc2tLSFJvYVhNcExuSmxiVzkyWlVOc1lYTnpLQ2RtYjNKdGJ5Y3BMbUZrWkVOc1lYTnpLQ2RtYjNKdGJ5MW1iMk4xY3ljcE8zMHBPd29rS0NkcGJuQjFkQzVtYjNKdGJ5Y3BMbUpwYm1Rb0oySnNkWEluTEdaMWJtTjBhVzl1S0NsN0pDaDBhR2x6S1M1eVpXMXZkbVZEYkdGemN5Z25abTl5Ylc4dFptOWpkWE1uS1M1aFpHUkRiR0Z6Y3lnblptOXliVzhuS1R0OUtUc0tKQ2duYVc1d2RYUXVabTl5Yld3bktTNWlhVzVrS0NkbWIyTjFjeWNzWm5WdVkzUnBiMjRvS1hza0tIUm9hWE1wTG5KbGJXOTJaVU5zWVhOektDZG1iM0p0YkNjcExtRmtaRU5zWVhOektDZG1iM0p0YkMxbWIyTjFjeWNwTzMwcE93b2tLQ2RwYm5CMWRDNW1iM0p0YkNjcExtSnBibVFvSjJKc2RYSW5MR1oxYm1OMGFXOXVLQ2w3SkNoMGFHbHpLUzV5WlcxdmRtVkRiR0Z6Y3lnblptOXliV3d0Wm05amRYTW5LUzVoWkdSRGJHRnpjeWduWm05eWJXd25LVHQ5S1RzS0NpOHZMUzArUEM5elkzSnBjSFErJyA+PC9kaXY+CgoKCgkKCQoJCgoKPC9kaXY+',
216
-				'balise' => '<div class="base64" title="bW9kZWxlIDogYTo3OntzOjQ6JnF1b3Q7bGFuZyZxdW90OztzOjI6JnF1b3Q7ZnImcXVvdDs7czo0OiZxdW90O2ZvbmQmcXVvdDs7czoxMjomcXVvdDttb2RlbGVzL2Zvcm0mcXVvdDs7czoxMDomcXVvdDtkaXJfcmFjaW5lJnF1b3Q7O3M6MzomcXVvdDsuLi8mcXVvdDs7czoyOiZxdW90O2lkJnF1b3Q7O3M6MTomcXVvdDsxJnF1b3Q7O3M6NzomcXVvdDtpZF9mb3JtJnF1b3Q7O3M6MTomcXVvdDsxJnF1b3Q7O3M6NDomcXVvdDtkYXRlJnF1b3Q7O3M6MTk6JnF1b3Q7MjAwNy0wNS0xMSAxMTo0MjoxOSZxdW90OztzOjEwOiZxdW90O2RhdGVfcmVkYWMmcXVvdDs7czoxOTomcXVvdDsyMDA3LTA1LTExIDExOjQyOjE5JnF1b3Q7O30KCmljaXRvdG8KCjxhIG5hbWU9J2Zvcm0xJz48L2E+CjxkaXYgY2xhc3M9J3NwaXBfZm9ybXMnPgoKPGRpdiBjbGFzcz0nc3BpcF9kZXNjcmlwdGlmJz48L2Rpdj4KCgoKCiAKCQkKCQk8ZGl2PgoJCQo8aW5wdXQgbmFtZT0nZXhlYycgdmFsdWU9J2FydGljbGVzJyB0eXBlPSdoaWRkZW4nIC8+CjxpbnB1dCBuYW1lPSdpZF9hcnRpY2xlJyB2YWx1ZT0nOCcgdHlwZT0naGlkZGVuJyAvPgoJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2Fqb3V0X3JlcG9uc2UnIHZhbHVlPScxJyAvPgoJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2lkX2Rvbm5lZScgdmFsdWU9Jy0xMCcgLz4KCQkKCQk8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdyZXRvdXJfZm9ybScgdmFsdWU9JycgLz4KCQkKCQk8L2Rpdj4KCQkJCgoKIAoJIAoJCQoJCSA8ZmllbGRzZXQ+PGxlZ2VuZD5Ob3VzIGNvbnRhY3RlcjwvbGVnZW5kPiAKCQoJIAoJCTxkaXYgY2xhc3M9J3NwaXBfZm9ybV9jaGFtcCBsaWduZV8xJz4KCQkJCgkJCSAKCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWwnPgoJCQkJCSA8bGFiZWwgZm9yPSJpbnB1dC0xLWxpZ25lXzEiPlZvdHJlIE5vbTwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCSAKCQkJCQoJCQkJPGlucHV0IHR5cGU9InRleHRlIiBuYW1lPSdsaWduZV8xJyBpZD0naW5wdXQtMS1saWduZV8xJyB2YWx1ZT0iIiAKCQkJCQkJY2xhc3M9JyAgbGlnbmUgZm9ybWwnIAoJCQkJCQlzaXplPSc0MCcgLz4KCQkJCQoJCQkJCgkJCQkKCQkJCTxzcGFuIGNsYXNzPSduZXR0b3lldXInPiA8L3NwYW4+CgkJCQoJCTwvZGl2PgoJCgoKCiAKCSAKCQkKCQkKCQoJIAoJCTxkaXYgY2xhc3M9J3NwaXBfZm9ybV9jaGFtcCBsaWduZV8yJz4KCQkJCgkJCSAKCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWwnPgoJCQkJCSA8bGFiZWwgZm9yPSJpbnB1dC0xLWxpZ25lXzIiPlZvdHJlIFByw6lub208L2xhYmVsPgoJCQkJCQoJCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWxfb2JsaWdhdG9pcmUnPgoJCQkJCQlbT2JsaWdhdG9pcmVdPC9zcGFuPgoJCQkJCToKCQkJCTwvc3Bhbj4KCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgCgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0ZSIgbmFtZT0nbGlnbmVfMicgaWQ9J2lucHV0LTEtbGlnbmVfMicgdmFsdWU9IiIgCgkJCQkJCWNsYXNzPScgIGxpZ25lIGZvcm1sJyAKCQkJCQkJc2l6ZT0nNDAnIC8+CgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgZW1haWxfMSc+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS1lbWFpbF8xIj5Wb3RyZSBlbWFpbDwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsX2RldGFpbHMnPlZldWlsbGV6IGVudHJlciB1bmUgYWRyZXNzZSBlLW1haWwgdmFsaWRlIChkZSB0eXBlIHZvdXNAZm91cm5pc3NldXIuY29tKS48L3NwYW4+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgCgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0ZSIgbmFtZT0nZW1haWxfMScgaWQ9J2lucHV0LTEtZW1haWxfMScgdmFsdWU9IiIgCgkJCQkJCWNsYXNzPScgIGVtYWlsIGZvcm1sJyAKCQkJCQkJc2l6ZT0nNDAnIC8+CgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgdGV4dGVfMSc+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS10ZXh0ZV8xIj5Wb3RyZSBBZHJlc3NlPC9sYWJlbD4KCQkJCQkKCQkJCQkKCQkJCQk6CgkJCQk8L3NwYW4+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCSAgPGRpdiBjbGFzcz0iYmFzZTY0amF2YXNjcmlwdDYxNjYyMzIzMDQ2NDQzNDk4YmRmMDE5LjMxMDkxNjM1IiB0aXRsZT0nUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaUlITnlZejBpTGk0dmNHeDFaMmx1Y3k5aFpHMXBiaTh0YWxGMVpYSjVMMmx0WjE5d1lXTnJMMnhoZVdWeUxtcHpJajQ4TDNOamNtbHdkRDQ9JyA+PC9kaXY+Cgo8ZGl2IGNsYXNzPSJiYXNlNjRqYXZhc2NyaXB0NjE2NjIzMjMwNDY0NDM0OThiZGYwMTkuMzEwOTE2MzUiIHRpdGxlPSdQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpSUhOeVl6MGlMaTR2Y0d4MVoybHVjeTltYjI1amRHbHZibTVoYkdsMFpYTXZZbUZ5Y21WZmRIbHdiMTlsWTI5c2IyZHBjWFZsTDJwekwzTndhWEJmWW1GeWNtVXVhbk1pUGp3dmMyTnlhWEIwUGc9PScgPjwvZGl2PgoKPHRhYmxlIGNsYXNzPSdzcGlwX2JhcnJlJyBzdHlsZT0nd2lkdGg6YXV0bzsnIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCcgYm9yZGVyPScwJyBzdW1tYXJ5PScnPgo8dHIgc3R5bGU9J3dpZHRoOiBhdXRvOycgY2xhc3M9J3NwaXBfYmFycmUnPgo8dGQgc3R5bGU9J3RleHQtYWxpZ246IGxlZnQ7JyB2YWxpZ249J21pZGRsZSc+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ3snLCd9Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGVuIHtpdGFsaXF1ZX0iPjxpbWcgc3JjPSdpbWdfcGFjay9pY29uZXNfYmFycmUvaXRhbGlxdWUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGVuIHtpdGFsaXF1ZX0iIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCd7eycsJ319Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGVuIHt7Z3Jhc319Ij48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2dyYXMucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGVuIHt7Z3Jhc319IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnWyonLCcqXScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBsZSB0ZXh0ZSBlbiBbKiZlYWN1dGU7dmlkZW5jZSpdIj48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9taXNlZW5ldmlkZW5jZS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJNZXR0cmUgbGUgdGV4dGUgZW4gWyomZWFjdXRlO3ZpZGVuY2UqXSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJyUzQ3N1cCUzRScsJyUzQy9zdXAlM0UnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJNZXR0cmUgbGUgdGV4dGUgZW4gJmx0O3N1cCZndDtleHBvc2FudCZsdDsvc3VwJmd0OyI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZXhwb3NhbnQucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGxlIHRleHRlIGVuICZsdDtzdXAmZ3Q7ZXhwb3NhbnQmbHQ7L3N1cCZndDsiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCclM0NzYyUzRScsJyUzQy9zYyUzRScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBsZSB0ZXh0ZSBlbiAmbHQ7c2MmZ3Q7cGV0aXRlcyBjYXBpdGFsZXMmbHQ7L3NjJmd0OyI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvcGV0aXRlc2NhcGl0YWxlcy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJNZXR0cmUgbGUgdGV4dGUgZW4gJmx0O3NjJmd0O3BldGl0ZXMgY2FwaXRhbGVzJmx0Oy9zYyZndDsiIC8+PC9hPiZuYnNwOzwvdGQ+Cjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCcxMScsJycpOyIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IlRyYW5zZm9ybWVyIGVuIFtsaWVuIGh5cGVydGV4dGUtPmh0dHA6Ly8uLi5dIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2xpZW4ucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iVHJhbnNmb3JtZXIgZW4gW2xpZW4gaHlwZXJ0ZXh0ZS0+aHR0cDovLy4uLl0iIC8+PC9hPiZuYnNwOzwvdGQ+Cjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnJTVDbiU1Q24lM0NxdW90ZSUzRScsJyUzQy9xdW90ZSUzRSU1Q24lNUNuJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iQ2l0ZXIgdW4gbWVzc2FnZSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9xdW90ZS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJDaXRlciB1biBtZXNzYWdlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnWz8nLCddJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iRW50ciZlYWN1dGU7ZSBkdSBbP2dsb3NzYWlyZV0gKFdpa2lwZWRpYSkiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2JhcnJlLXdpa2kucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iRW50ciZlYWN1dGU7ZSBkdSBbP2dsb3NzYWlyZV0gKFdpa2lwZWRpYSkiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6c3dhcF9jb3VjaGUoJzEwJywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gdGFibGVhdSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvYmFycmUtdGFibGVhdS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biB0YWJsZWF1IiAvPjwvYT4mbmJzcDwvdGQ+Cjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCcxNCcsJycpOyIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkNoZXJjaGVyIFJlbXBsYWNlciI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvY2hlcmNoZXJfcmVtcGxhY2VyLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkNoZXJjaGVyIFJlbXBsYWNlciIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnMTInLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJHZXN0aW9uIGRlcyBhbmNyZXMiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FuY3JlLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ikdlc3Rpb24gZGVzIGFuY3JlcyIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOmxlZnQ7JyB2YWxpZ249J21pZGRsZSc+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnMTMnLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJDYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXgiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2NsYXZpZXIucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iQ2FyYWN0JmVncmF2ZTtyZXMgc3AmZWFjdXRlO2NpYXV4IiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQgc3R5bGU9J3RleHQtYWxpZ246cmlnaHQ7JyB2YWxpZ249J21pZGRsZSc+Jm5ic3A7Jm5ic3A7PGEgY2xhc3M9J2FpZGUnIGhyZWY9J2h0dHA6Ly9wcmVwcm9kLm5vdHJlLXZpbGxlLm5ldC9+c3RzZWIvZWNyaXJlLz9leGVjPWFpZGVfaW5kZXgmYW1wO2FpZGU9cmFjY291cmNpcyZhbXA7dmFyX2xhbmc9ZnInIHRhcmdldD0ic3BpcF9haWRlIiBvbmNsaWNrPSJqYXZhc2NyaXB0OndpbmRvdy5vcGVuKHRoaXMuaHJlZiwnc3BpcF9haWRlJywgJ3Njcm9sbGJhcnM9eWVzLCByZXNpemFibGU9eWVzLCB3aWR0aD03NDAsIGhlaWdodD01ODAnKTsgcmV0dXJuIGZhbHNlOyI+PGltZyBzcmM9J2ltZ19wYWNrL2FpZGUuZ2lmJwphbHQ9IkFJREUiIHRpdGxlPSJEZSBsJ2FpZGUgc3VyIGNldCAmZWFjdXRlO2wmZWFjdXRlO21lbnQiIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgYWxpZ249Im1pZGRsZSIgLz48L2E+Jm5ic3A7PC90ZD48L3RyPjwvdGFibGU+PGRpdiBpZD0nTGF5ZXIxMCcgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID48dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCjx0cj48dGQ+DQpOYiBjb2xvbm5lczogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX25iY29sb25lcyIgc3R5bGU9IndpZHRoOiAzMHB4OyIgdmFsdWU9IjIiIHNpemU9IjIiIG1heGxlbmd0aD0iMiIgICAvPjwvdGQ+PHRkPg0KTmIgbGlnbmVzOiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYmFycmVfbmJyYW5ncyIgc3R5bGU9IndpZHRoOiAzMHB4OyIgdmFsdWU9IjIiIHNpemU9IjIiIG1heGxlbmd0aD0iMiIgLz48L3RkPjx0ZD4NCjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iYmFycmVfZG9lbnRldGUiIHZhbHVlPSItMSIgY2hlY2tlZD0iY2hlY2tlZCIgLz4gRW50ZXRlPC90ZD48dGQ+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImJhcnJlX2RvY2FwdGlvbiIgdmFsdWU9Ii0xIiBjaGVja2VkPSJjaGVja2VkIiAvPiBDYXB0aW9uIGV0IFImZWFjdXRlO3N1bSZlYWN1dGU7PC90ZD48dGQ+DQogIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIiBvbmNsaWNrPSJqYXZhc2NyaXB0Og0KICAgIGJhcnJlX25iY29sb25lcy52YWx1ZSA9IE1hdGguYWJzKGJhcnJlX25iY29sb25lcy52YWx1ZSk7IGJhcnJlX25icmFuZ3MudmFsdWUNCiAgICA9IE1hdGguYWJzKGJhcnJlX25icmFuZ3MudmFsdWUpOw0KICAgIGlmICghKGJhcnJlX25iY29sb25lcy52YWx1ZSA9PSAwIHx8IGJhcnJlX25icmFuZ3MudmFsdWUgPT0gMCkpIHsNCiAgICBiYXJyZV90YWJsZWF1KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSwgYmFycmVfbmJjb2xvbmVzLnZhbHVlLCBiYXJyZV9uYnJhbmdzLnZhbHVlLA0KICAgIGJhcnJlX2RvZW50ZXRlLmNoZWNrZWQsIGJhcnJlX2RvY2FwdGlvbi5jaGVja2VkKTsgfSAiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+DQo8ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyMTEnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQogPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkPiANCkFkcmVzc2UmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX25vbSIgdmFsdWU9Imh0dHA6Ly8iIHNpemU9IjIxIiBtYXhsZW5ndGg9IjI1NSIgLz48YnIgLz4NCkJ1bGxlIGQnYWlkZSZuYnNwOzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxpZW5fYnVsbGUiIHZhbHVlPSIiIHNpemU9IjIxIiBtYXhsZW5ndGg9IjI1NSIgLz4NCjwvdGQ+PHRkPg0KTGFuZ3VlIGFiciZlYWN1dGU7ZyZlYWN1dGU7ZSZuYnNwOzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxpZW5fbGFuZ3VlIiB2YWx1ZT0iIiBzaXplPSIxMCIgbWF4bGVuZ3RoPSIxMCIgLz4NCjwvdGQ+PHRkPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9kZW1hbmRlX2xpZW4oJ1snLCAnLT4nLCAnXScsIGxpZW5fbm9tLnZhbHVlLCBsaWVuX2J1bGxlLnZhbHVlLCBsaWVuX2xhbmd1ZS52YWx1ZSxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpOyIgLz4gDQo8L3RkPjwvdHI+PC90YWJsZT4NCjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXIxMicgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID4NCjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KICA8dHI+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyB0ZXh0LWFsaWduOmNlbnRlcjsiPjxzdHJvbmc+R2VzdGlvbiBkZXMgYW5jcmVzPC9zdHJvbmc+PC90ZD4NCiAgICA8dGQgc3R5bGU9IndpZHRoOmF1dG87Ij48c3Ryb25nPlRyYW5zZm9ybWVyIGVuIGFuY3JlPC9zdHJvbmc+PGJyIC8+DQogICAgPGxhYmVsIGZvcj0iYW5jcmVfbm9tIj48aT5Ob20gZGUgbCdhbmNyZTwvaT48L2xhYmVsPiA8YnIgLz4NCiAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9ub20iIGlkPSJhbmNyZV9ub20iIC8+DQoJICANCgk8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9hbmNyZSgnWycsICc8LScsICddJywgYW5jcmVfbm9tLnZhbHVlLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpOyIgLz4NCiAgICA8L3RkPg0KCTx0ZCBzdHlsZT0id2lkdGg6YXV0bzsiPjxzdHJvbmc+UG9pbnRlciB2ZXJzIHVuZSBhbmNyZTwvc3Ryb25nPjxiciAvPg0KICAgIDxsYWJlbCBmb3I9ImFuY3JlX2NpYmxlIj48aT5BbmNyZSBjaWJsZTwvaT48L2xhYmVsPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYW5jcmVfY2libGUiIGlkPSJhbmNyZV9jaWJsZSIgLz48YnIgLz4NCgk8bGFiZWwgZm9yPSJhbmNyZV9idWxsZSI+PGk+QnVsbGUgZCdhaWRlIGFuY3JlPC9pPjwvbGFiZWw+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9idWxsZSIgaWQ9ImFuY3JlX2J1bGxlIiAvPg0KCTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIiBvbmNsaWNrPSJqYXZhc2NyaXB0OmJhcnJlX2RlbWFuZGUoJ1snLCAnLT4jJywgJ10nLCBhbmNyZV9jaWJsZS52YWx1ZSwgYW5jcmVfYnVsbGUudmFsdWUsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSk7IiAvPiANCjwvdGQ+DQogIDwvdHI+IA0KPC90YWJsZT48ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyMTMnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQo8dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCiAgPHRyIGNsYXNzPSJzcGlwX2JhcnJlIj4NCiAgICA8dGQgc3R5bGU9IndpZHRoOjMwJTsiPkNhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eDwvdGQ+DQogICAgPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCdcdTAwYWJ+Jywnflx1MDBiYicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkVudG91cmVyIGRlICZsYXF1bzsgZ3VpbGxlbWV0cyAmcmFxdW87Ij48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2d1aWxsZW1ldHMucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iRW50b3VyZXIgZGUgJmxhcXVvOyBndWlsbGVtZXRzICZyYXF1bzsiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCdcdTAwOTMnLCdcdTAwOTQnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJFbnRvdXJlciBkZSAmbGRxdW87Z3VpbGxlbWV0cyBkZSBzZWNvbmQgbml2ZWF1JnJkcXVvOyI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9ndWlsbGVtZXRzLXNpbXBsZXMucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iRW50b3VyZXIgZGUgJmxkcXVvO2d1aWxsZW1ldHMgZGUgc2Vjb25kIG5pdmVhdSZyZHF1bzsiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGMwJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gQSBhY2NlbnQgZ3JhdmUgbWFqdXNjdWxlIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2FncmF2ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gQSBhY2NlbnQgZ3JhdmUgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjOScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgYWNjZW50IGFpZ3UgbWFqdXNjdWxlIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2VhY3V0ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBhY2NlbnQgYWlndSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM4Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBtYWp1c2N1bGUgYWNjZW50IGdyYXZlIj48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9lYWdyYXZlLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIG1hanVzY3VsZSBhY2NlbnQgZ3JhdmUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGU2Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvYWVsaWcucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzYnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIG1hanVzY3VsZSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvYWVsaWctbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJyZvZWxpZzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL29lbGlnLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ08iIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignJk9FbGlnOycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ08gbWFqdXNjdWxlIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL29lbGlnLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzcnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBDIGMmZWFjdXRlO2RpbGxlIG1hanVzY3VsZSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvY2NlZGlsLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBDIGMmZWFjdXRlO2RpbGxlIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCcmZXVybzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciBsZSBzeW1ib2xlICZldXJvOyI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9ldXJvLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIGxlIHN5bWJvbGUgJmV1cm87IiAvPjwvYT4mbmJzcDsNCiAgICA8L3RkPg0KICA8L3RyPiANCjwvdGFibGU+DQo8ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyMTQnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQo8dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCjx0cj48dGQgc3R5bGU9IndpZHRoOiAyNSU7Ij5DaGVyY2hlcjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9jaGVyY2hlciIgdmFsdWU9IiIgc2l6ZT0iMTIiIG1heGxlbmd0aD0iMjU1IiAvPjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMjAlOyI+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY19jYXNlIiB2YWx1ZT0ieWVzIiAvPlJlc3BlY3RlciBsYSBjYXNzZTxiciAvPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjX2VudGllciIgdmFsdWU9InllcyIgLz4NCk1vdCBlbnRpZXINCjwvdGQ+PHRkICBzdHlsZT0id2lkdGg6IDI1JTsiPlJlbXBsYWNlcjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9yZW1wbGFjZXIiIHZhbHVlPSIiIHNpemU9IjEyIiBtYXhsZW5ndGg9IjI1NSIgLz4gDQo8L3RkPjx0ZCBzdHlsZT0id2lkdGg6IDIwJTsiPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZWNfdG91dCIgdmFsdWU9InllcyIgLz5Ub3V0IHJlbXBsYWNlcjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMTAlOyI+DQogICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyINCiAgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9zZWFyY2hyZXBsYWNlKGRvY3VtZW50LmZvcm11bGFpcmUuYmFycmVfY2hlcmNoZXIudmFsdWUsIGRvY3VtZW50LmZvcm11bGFpcmUuYmFycmVfcmVtcGxhY2VyLnZhbHVlLCBkb2N1bWVudC5mb3JtdWxhaXJlLnJlY190b3V0LmNoZWNrZWQsIGRvY3VtZW50LmZvcm11bGFpcmUucmVjX2Nhc2UuY2hlY2tlZCwgZG9jdW1lbnQuZm9ybXVsYWlyZS5yZWNfZW50aWVyLmNoZWNrZWQsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKTsiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+PGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj4KCTx0ZXh0YXJlYSBuYW1lPSd0ZXh0ZV8xJyByb3dzPScxMCcgY2xhc3M9J2Zvcm1vICAgJyBjb2xzPSc4MCcKCWlkPSdpbnB1dC0xLXRleHRlXzEnCglvbnNlbGVjdD0nc3RvcmVDYXJldCh0aGlzKTsnCglvbmNsaWNrPSdzdG9yZUNhcmV0KHRoaXMpOycKCW9ua2V5dXA9J3N0b3JlQ2FyZXQodGhpcyk7JwoJb25kYmxjbGljaz0nc3RvcmVDYXJldCh0aGlzKTsnPjwvdGV4dGFyZWE+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgdGV4dGVfMic+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS10ZXh0ZV8yIj5Wb3RyZSBRdWVzdGlvbjwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgIDx0YWJsZSBjbGFzcz0nc3BpcF9iYXJyZScgc3R5bGU9J3dpZHRoOmF1dG87JyBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnIGJvcmRlcj0nMCcgc3VtbWFyeT0nJz4KPHRyIHN0eWxlPSd3aWR0aDogYXV0bzsnIGNsYXNzPSdzcGlwX2JhcnJlJz4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOiBsZWZ0OycgdmFsaWduPSdtaWRkbGUnPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCd7JywnfScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBlbiB7aXRhbGlxdWV9Ij48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2l0YWxpcXVlLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBlbiB7aXRhbGlxdWV9IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgne3snLCd9fScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBlbiB7e2dyYXN9fSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9ncmFzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBlbiB7e2dyYXN9fSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ1sqJywnKl0nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJNZXR0cmUgbGUgdGV4dGUgZW4gWyomZWFjdXRlO3ZpZGVuY2UqXSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvbWlzZWVuZXZpZGVuY2UucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGxlIHRleHRlIGVuIFsqJmVhY3V0ZTt2aWRlbmNlKl0iIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCclM0NzdXAlM0UnLCclM0Mvc3VwJTNFJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGxlIHRleHRlIGVuICZsdDtzdXAmZ3Q7ZXhwb3NhbnQmbHQ7L3N1cCZndDsiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2V4cG9zYW50LnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBsZSB0ZXh0ZSBlbiAmbHQ7c3VwJmd0O2V4cG9zYW50Jmx0Oy9zdXAmZ3Q7IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnJTNDc2MlM0UnLCclM0Mvc2MlM0UnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJNZXR0cmUgbGUgdGV4dGUgZW4gJmx0O3NjJmd0O3BldGl0ZXMgY2FwaXRhbGVzJmx0Oy9zYyZndDsiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL3BldGl0ZXNjYXBpdGFsZXMucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGxlIHRleHRlIGVuICZsdDtzYyZndDtwZXRpdGVzIGNhcGl0YWxlcyZsdDsvc2MmZ3Q7IiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnMTYnLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJUcmFuc2Zvcm1lciBlbiBbbGllbiBoeXBlcnRleHRlLT5odHRwOi8vLi4uXSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9saWVuLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IlRyYW5zZm9ybWVyIGVuIFtsaWVuIGh5cGVydGV4dGUtPmh0dHA6Ly8uLi5dIiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJyU1Q24lNUNuJTNDcXVvdGUlM0UnLCclM0MvcXVvdGUlM0UlNUNuJTVDbicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkNpdGVyIHVuIG1lc3NhZ2UiPjxpbWcgc3JjPSdpbWdfcGFjay9pY29uZXNfYmFycmUvcXVvdGUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iQ2l0ZXIgdW4gbWVzc2FnZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ1s/JywnXScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkVudHImZWFjdXRlO2UgZHUgWz9nbG9zc2FpcmVdIChXaWtpcGVkaWEpIj48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9iYXJyZS13aWtpLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudHImZWFjdXRlO2UgZHUgWz9nbG9zc2FpcmVdIChXaWtpcGVkaWEpIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCcxNScsJycpOyIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIHRhYmxlYXUiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2JhcnJlLXRhYmxlYXUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gdGFibGVhdSIgLz48L2E+Jm5ic3A8L3RkPgo8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnMTknLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJDaGVyY2hlciBSZW1wbGFjZXIiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2NoZXJjaGVyX3JlbXBsYWNlci5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJDaGVyY2hlciBSZW1wbGFjZXIiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6c3dhcF9jb3VjaGUoJzE3JywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iR2VzdGlvbiBkZXMgYW5jcmVzIj48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9hbmNyZS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJHZXN0aW9uIGRlcyBhbmNyZXMiIC8+PC9hPiZuYnNwOzwvdGQ+Cjx0ZCBzdHlsZT0ndGV4dC1hbGlnbjpsZWZ0OycgdmFsaWduPSdtaWRkbGUnPjxhIGhyZWY9ImphdmFzY3JpcHQ6c3dhcF9jb3VjaGUoJzE4JywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iQ2FyYWN0JmVncmF2ZTtyZXMgc3AmZWFjdXRlO2NpYXV4Ij48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9jbGF2aWVyLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkNhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eCIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOnJpZ2h0OycgdmFsaWduPSdtaWRkbGUnPiZuYnNwOyZuYnNwOzxhIGNsYXNzPSdhaWRlJyBocmVmPSdodHRwOi8vcHJlcHJvZC5ub3RyZS12aWxsZS5uZXQvfnN0c2ViL2VjcmlyZS8/ZXhlYz1haWRlX2luZGV4JmFtcDthaWRlPXJhY2NvdXJjaXMmYW1wO3Zhcl9sYW5nPWZyJyB0YXJnZXQ9InNwaXBfYWlkZSIgb25jbGljaz0iamF2YXNjcmlwdDp3aW5kb3cub3Blbih0aGlzLmhyZWYsJ3NwaXBfYWlkZScsICdzY3JvbGxiYXJzPXllcywgcmVzaXphYmxlPXllcywgd2lkdGg9NzQwLCBoZWlnaHQ9NTgwJyk7IHJldHVybiBmYWxzZTsiPjxpbWcgc3JjPSdpbWdfcGFjay9haWRlLmdpZicKYWx0PSJBSURFIiB0aXRsZT0iRGUgbCdhaWRlIHN1ciBjZXQgJmVhY3V0ZTtsJmVhY3V0ZTttZW50IiB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIGFsaWduPSJtaWRkbGUiIC8+PC9hPiZuYnNwOzwvdGQ+PC90cj48L3RhYmxlPjxkaXYgaWQ9J0xheWVyMTUnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+PHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkPg0KTmIgY29sb25uZXM6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9uYmNvbG9uZXMiIHN0eWxlPSJ3aWR0aDogMzBweDsiIHZhbHVlPSIyIiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiICAgLz48L3RkPjx0ZD4NCk5iIGxpZ25lczogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX25icmFuZ3MiIHN0eWxlPSJ3aWR0aDogMzBweDsiIHZhbHVlPSIyIiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiIC8+PC90ZD48dGQ+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImJhcnJlX2RvZW50ZXRlIiB2YWx1ZT0iLTEiIGNoZWNrZWQ9ImNoZWNrZWQiIC8+IEVudGV0ZTwvdGQ+PHRkPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJiYXJyZV9kb2NhcHRpb24iIHZhbHVlPSItMSIgY2hlY2tlZD0iY2hlY2tlZCIgLz4gQ2FwdGlvbiBldCBSJmVhY3V0ZTtzdW0mZWFjdXRlOzwvdGQ+PHRkPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDoNCiAgICBiYXJyZV9uYmNvbG9uZXMudmFsdWUgPSBNYXRoLmFicyhiYXJyZV9uYmNvbG9uZXMudmFsdWUpOyBiYXJyZV9uYnJhbmdzLnZhbHVlDQogICAgPSBNYXRoLmFicyhiYXJyZV9uYnJhbmdzLnZhbHVlKTsNCiAgICBpZiAoIShiYXJyZV9uYmNvbG9uZXMudmFsdWUgPT0gMCB8fCBiYXJyZV9uYnJhbmdzLnZhbHVlID09IDApKSB7DQogICAgYmFycmVfdGFibGVhdShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJyksIGJhcnJlX25iY29sb25lcy52YWx1ZSwgYmFycmVfbmJyYW5ncy52YWx1ZSwNCiAgICBiYXJyZV9kb2VudGV0ZS5jaGVja2VkLCBiYXJyZV9kb2NhcHRpb24uY2hlY2tlZCk7IH0gIiAvPiANCjwvdGQ+PC90cj48L3RhYmxlPg0KPGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjE2JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KIDx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KPHRyPjx0ZD4gDQpBZHJlc3NlJm5ic3A7OiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibGllbl9ub20iIHZhbHVlPSJodHRwOi8vIiBzaXplPSIyMSIgbWF4bGVuZ3RoPSIyNTUiIC8+PGJyIC8+DQpCdWxsZSBkJ2FpZGUmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX2J1bGxlIiB2YWx1ZT0iIiBzaXplPSIyMSIgbWF4bGVuZ3RoPSIyNTUiIC8+DQo8L3RkPjx0ZD4NCkxhbmd1ZSBhYnImZWFjdXRlO2cmZWFjdXRlO2UmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX2xhbmd1ZSIgdmFsdWU9IiIgc2l6ZT0iMTAiIG1heGxlbmd0aD0iMTAiIC8+DQo8L3RkPjx0ZD4NCiAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfZGVtYW5kZV9saWVuKCdbJywgJy0+JywgJ10nLCBsaWVuX25vbS52YWx1ZSwgbGllbl9idWxsZS52YWx1ZSwgbGllbl9sYW5ndWUudmFsdWUsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKTsiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+DQo8ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyMTcnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQo8dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCiAgPHRyPg0KICAgIDx0ZCBzdHlsZT0id2lkdGg6YXV0bzsgdGV4dC1hbGlnbjpjZW50ZXI7Ij48c3Ryb25nPkdlc3Rpb24gZGVzIGFuY3Jlczwvc3Ryb25nPjwvdGQ+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyI+PHN0cm9uZz5UcmFuc2Zvcm1lciBlbiBhbmNyZTwvc3Ryb25nPjxiciAvPg0KICAgIDxsYWJlbCBmb3I9ImFuY3JlX25vbSI+PGk+Tm9tIGRlIGwnYW5jcmU8L2k+PC9sYWJlbD4gPGJyIC8+DQogICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYW5jcmVfbm9tIiBpZD0iYW5jcmVfbm9tIiAvPg0KCSAgDQoJPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfYW5jcmUoJ1snLCAnPC0nLCAnXScsIGFuY3JlX25vbS52YWx1ZSwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKTsiIC8+DQogICAgPC90ZD4NCgk8dGQgc3R5bGU9IndpZHRoOmF1dG87Ij48c3Ryb25nPlBvaW50ZXIgdmVycyB1bmUgYW5jcmU8L3N0cm9uZz48YnIgLz4NCiAgICA8bGFiZWwgZm9yPSJhbmNyZV9jaWJsZSI+PGk+QW5jcmUgY2libGU8L2k+PC9sYWJlbD4gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImFuY3JlX2NpYmxlIiBpZD0iYW5jcmVfY2libGUiIC8+PGJyIC8+DQoJPGxhYmVsIGZvcj0iYW5jcmVfYnVsbGUiPjxpPkJ1bGxlIGQnYWlkZSBhbmNyZTwvaT48L2xhYmVsPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYW5jcmVfYnVsbGUiIGlkPSJhbmNyZV9idWxsZSIgLz4NCgk8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9kZW1hbmRlKCdbJywgJy0+IycsICddJywgYW5jcmVfY2libGUudmFsdWUsIGFuY3JlX2J1bGxlLnZhbHVlLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpOyIgLz4gDQo8L3RkPg0KICA8L3RyPiANCjwvdGFibGU+PGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjE4JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQogIDx0ciBjbGFzcz0ic3BpcF9iYXJyZSI+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDozMCU7Ij5DYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXg8L3RkPg0KICAgIDx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnXHUwMGFificsJ35cdTAwYmInLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJFbnRvdXJlciBkZSAmbGFxdW87IGd1aWxsZW1ldHMgJnJhcXVvOyI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9ndWlsbGVtZXRzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudG91cmVyIGRlICZsYXF1bzsgZ3VpbGxlbWV0cyAmcmFxdW87IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnXHUwMDkzJywnXHUwMDk0Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iRW50b3VyZXIgZGUgJmxkcXVvO2d1aWxsZW1ldHMgZGUgc2Vjb25kIG5pdmVhdSZyZHF1bzsiPjxpbWcgc3JjPSdpbWdfcGFjay9pY29uZXNfYmFycmUvZ3VpbGxlbWV0cy1zaW1wbGVzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudG91cmVyIGRlICZsZHF1bztndWlsbGVtZXRzIGRlIHNlY29uZCBuaXZlYXUmcmRxdW87IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjMCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEEgYWNjZW50IGdyYXZlIG1hanVzY3VsZSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9hZ3JhdmUtbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEEgYWNjZW50IGdyYXZlIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzknLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGFjY2VudCBhaWd1IG1hanVzY3VsZSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9lYWN1dGUtbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgYWNjZW50IGFpZ3UgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjOCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgbWFqdXNjdWxlIGFjY2VudCBncmF2ZSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZWFncmF2ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBtYWp1c2N1bGUgYWNjZW50IGdyYXZlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBlNicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FlbGlnLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM2Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSBtYWp1c2N1bGUiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FlbGlnLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCcmb2VsaWc7Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9vZWxpZy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJyZPRWxpZzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIG1hanVzY3VsZSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9vZWxpZy1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM3Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gQyBjJmVhY3V0ZTtkaWxsZSBtYWp1c2N1bGUiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2NjZWRpbC1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gQyBjJmVhY3V0ZTtkaWxsZSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignJmV1cm87Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgbGUgc3ltYm9sZSAmZXVybzsiPjxpbWcgc3JjPSdpbWdfcGFjay9pY29uZXNfYmFycmUvZXVyby5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciBsZSBzeW1ib2xlICZldXJvOyIgLz48L2E+Jm5ic3A7DQogICAgPC90ZD4NCiAgPC90cj4gDQo8L3RhYmxlPg0KPGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjE5JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkIHN0eWxlPSJ3aWR0aDogMjUlOyI+Q2hlcmNoZXI8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYmFycmVfY2hlcmNoZXIiIHZhbHVlPSIiIHNpemU9IjEyIiBtYXhsZW5ndGg9IjI1NSIgLz48L3RkPjx0ZCBzdHlsZT0id2lkdGg6IDIwJTsiPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZWNfY2FzZSIgdmFsdWU9InllcyIgLz5SZXNwZWN0ZXIgbGEgY2Fzc2U8YnIgLz48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY19lbnRpZXIiIHZhbHVlPSJ5ZXMiIC8+DQpNb3QgZW50aWVyDQo8L3RkPjx0ZCAgc3R5bGU9IndpZHRoOiAyNSU7Ij5SZW1wbGFjZXI8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYmFycmVfcmVtcGxhY2VyIiB2YWx1ZT0iIiBzaXplPSIxMiIgbWF4bGVuZ3RoPSIyNTUiIC8+IA0KPC90ZD48dGQgc3R5bGU9IndpZHRoOiAyMCU7Ij4NCjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjX3RvdXQiIHZhbHVlPSJ5ZXMiIC8+VG91dCByZW1wbGFjZXI8L3RkPjx0ZCBzdHlsZT0id2lkdGg6IDEwJTsiPg0KICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iDQogIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfc2VhcmNocmVwbGFjZShkb2N1bWVudC5mb3JtdWxhaXJlLmJhcnJlX2NoZXJjaGVyLnZhbHVlLCBkb2N1bWVudC5mb3JtdWxhaXJlLmJhcnJlX3JlbXBsYWNlci52YWx1ZSwgZG9jdW1lbnQuZm9ybXVsYWlyZS5yZWNfdG91dC5jaGVja2VkLCBkb2N1bWVudC5mb3JtdWxhaXJlLnJlY19jYXNlLmNoZWNrZWQsIGRvY3VtZW50LmZvcm11bGFpcmUucmVjX2VudGllci5jaGVja2VkLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSk7IiAvPiANCjwvdGQ+PC90cj48L3RhYmxlPjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+Cgk8dGV4dGFyZWEgbmFtZT0ndGV4dGVfMicgcm93cz0nMTAnIGNsYXNzPSdmb3JtbCAgICcgY29scz0nODAnCglpZD0naW5wdXQtMS10ZXh0ZV8yJwoJb25zZWxlY3Q9J3N0b3JlQ2FyZXQodGhpcyk7JwoJb25jbGljaz0nc3RvcmVDYXJldCh0aGlzKTsnCglvbmtleXVwPSdzdG9yZUNhcmV0KHRoaXMpOycKCW9uZGJsY2xpY2s9J3N0b3JlQ2FyZXQodGhpcyk7Jz48L3RleHRhcmVhPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJPHNwYW4gY2xhc3M9J25ldHRveWV1cic+IDwvc3Bhbj4KCQkJCgkJPC9kaXY+CgkKCgogCgk8L2ZpZWxkc2V0PgoKIAogCgkKCTxwIHN0eWxlPSdkaXNwbGF5Om5vbmU7Jz48bGFiZWwgZm9yPSJub2JvdG5vYm90LTEiPlZldWlsbGV6IGxhaXNzZXIgY2UgY2hhbXAgdmlkZSZuYnNwOzo8L2xhYmVsPgoJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im5vYm90bm9ib3QiIGlkPSJub2JvdG5vYm90LTEiIHZhbHVlPSIiIHNpemU9IjEwIiAvPjwvcD4KCQoJPGRpdiBzdHlsZT0ndGV4dC1hbGlnbjpyaWdodCcgY2xhc3M9J3NwaXBfYm91dG9uJz48aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSdWYWxpZGVyJyB2YWx1ZT0iVmFsaWRlciIgLz48L2Rpdj4KCgo8ZGl2IGNsYXNzPSJiYXNlNjRqYXZhc2NyaXB0NjE2NjIzMjMwNDY0NDM0OThiZGYwMTkuMzEwOTE2MzUiIHRpdGxlPSdQSE5qY21sd2RDQnpjbU05SW1oMGRIQTZMeTl3Y21Wd2NtOWtMbTV2ZEhKbExYWnBiR3hsTG01bGRDOStjM1J6WldJdmNHeDFaMmx1Y3k5bWIyNWpkR2x2Ym01aGJHbDBaWE12Wm05eWJYTXZhbUYyWVhOamNtbHdkQzlxZEdsd0xtcHpJaUIwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBqd3ZjMk55YVhCMFBnPT0nID48L2Rpdj4KCgoKPGRpdiBjbGFzcz0iYmFzZTY0amF2YXNjcmlwdDYxNjYyMzIzMDQ2NDQzNDk4YmRmMDE5LjMxMDkxNjM1IiB0aXRsZT0nUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBqd2hMUzBLSkNnbmFXNXdkWFF1Wm05eWJXOG5LUzVpYVc1a0tDZG1iMk4xY3ljc1puVnVZM1JwYjI0b0tYc2tLSFJvYVhNcExuSmxiVzkyWlVOc1lYTnpLQ2RtYjNKdGJ5Y3BMbUZrWkVOc1lYTnpLQ2RtYjNKdGJ5MW1iMk4xY3ljcE8zMHBPd29rS0NkcGJuQjFkQzVtYjNKdGJ5Y3BMbUpwYm1Rb0oySnNkWEluTEdaMWJtTjBhVzl1S0NsN0pDaDBhR2x6S1M1eVpXMXZkbVZEYkdGemN5Z25abTl5Ylc4dFptOWpkWE1uS1M1aFpHUkRiR0Z6Y3lnblptOXliVzhuS1R0OUtUc0tKQ2duYVc1d2RYUXVabTl5Yld3bktTNWlhVzVrS0NkbWIyTjFjeWNzWm5WdVkzUnBiMjRvS1hza0tIUm9hWE1wTG5KbGJXOTJaVU5zWVhOektDZG1iM0p0YkNjcExtRmtaRU5zWVhOektDZG1iM0p0YkMxbWIyTjFjeWNwTzMwcE93b2tLQ2RwYm5CMWRDNW1iM0p0YkNjcExtSnBibVFvSjJKc2RYSW5MR1oxYm1OMGFXOXVLQ2w3SkNoMGFHbHpLUzV5WlcxdmRtVkRiR0Z6Y3lnblptOXliV3d0Wm05amRYTW5LUzVoWkdSRGJHRnpjeWduWm05eWJXd25LVHQ5S1RzS0NpOHZMUzArUEM5elkzSnBjSFErJyA+PC9kaXY+CgoKCgkKCQoJCgoKPC9kaXY+" ></div>',
217
-				'attribut' => 'title',
218
-			],
207
+    public static function providerBase64(): array {
208
+        return [
209
+            'base64 #1' => [
210
+                'expected' => 'PGEgbmFtZT0nZm9ybTEnPjwvYT4KPGRpdiBjbGFzcz0nc3BpcF9mb3Jtcyc+Cgo8ZGl2IGNsYXNzPSdzcGlwX2Rlc2NyaXB0aWYnPjwvZGl2PgoKCgoKIAoJIAoJPGZvcm0gbWV0aG9kPSdwb3N0JyBhY3Rpb249J0NvbnRhY3QuaHRtbCNmb3JtMScKCQllbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KCQkKCQk8ZGl2PgoJCQoJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2Fqb3V0X3JlcG9uc2UnIHZhbHVlPScxJyAvPgoJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2lkX2Rvbm5lZScgdmFsdWU9Jy0xMCcgLz4KCQkKCQk8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdyZXRvdXJfZm9ybScgdmFsdWU9JycgLz4KCQkKCQk8L2Rpdj4KCQkJCgoKIAoJIAoJCQoJCSA8ZmllbGRzZXQ+PGxlZ2VuZD5Ob3VzIGNvbnRhY3RlcjwvbGVnZW5kPiAKCQoJIAoJCTxkaXYgY2xhc3M9J3NwaXBfZm9ybV9jaGFtcCBsaWduZV8xJz4KCQkJCgkJCSAKCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWwnPgoJCQkJCSA8bGFiZWwgZm9yPSJpbnB1dC0xLWxpZ25lXzEiPlZvdHJlIE5vbTwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCSAKCQkJCQoJCQkJPGlucHV0IHR5cGU9InRleHRlIiBuYW1lPSdsaWduZV8xJyBpZD0naW5wdXQtMS1saWduZV8xJyB2YWx1ZT0iIiAKCQkJCQkJY2xhc3M9JyAgbGlnbmUgZm9ybWwnIAoJCQkJCQlzaXplPSc0MCcgLz4KCQkJCQoJCQkJCgkJCQkKCQkJCTxzcGFuIGNsYXNzPSduZXR0b3lldXInPiA8L3NwYW4+CgkJCQoJCTwvZGl2PgoJCgoKCiAKCSAKCQkKCQkKCQoJIAoJCTxkaXYgY2xhc3M9J3NwaXBfZm9ybV9jaGFtcCBsaWduZV8yJz4KCQkJCgkJCSAKCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWwnPgoJCQkJCSA8bGFiZWwgZm9yPSJpbnB1dC0xLWxpZ25lXzIiPlZvdHJlIFByw6lub208L2xhYmVsPgoJCQkJCQoJCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWxfb2JsaWdhdG9pcmUnPgoJCQkJCQlbT2JsaWdhdG9pcmVdPC9zcGFuPgoJCQkJCToKCQkJCTwvc3Bhbj4KCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgCgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0ZSIgbmFtZT0nbGlnbmVfMicgaWQ9J2lucHV0LTEtbGlnbmVfMicgdmFsdWU9IiIgCgkJCQkJCWNsYXNzPScgIGxpZ25lIGZvcm1sJyAKCQkJCQkJc2l6ZT0nNDAnIC8+CgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgZW1haWxfMSc+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS1lbWFpbF8xIj5Wb3RyZSBlbWFpbDwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsX2RldGFpbHMnPlZldWlsbGV6IGVudHJlciB1bmUgYWRyZXNzZSBlLW1haWwgdmFsaWRlIChkZSB0eXBlIHZvdXNAZm91cm5pc3NldXIuY29tKS48L3NwYW4+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgCgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0ZSIgbmFtZT0nZW1haWxfMScgaWQ9J2lucHV0LTEtZW1haWxfMScgdmFsdWU9IiIgCgkJCQkJCWNsYXNzPScgIGVtYWlsIGZvcm1sJyAKCQkJCQkJc2l6ZT0nNDAnIC8+CgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgdGV4dGVfMSc+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS10ZXh0ZV8xIj5Wb3RyZSBBZHJlc3NlPC9sYWJlbD4KCQkJCQkKCQkJCQkKCQkJCQk6CgkJCQk8L3NwYW4+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCSAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0icGx1Z2lucy9hZG1pbi8talF1ZXJ5L2ltZ19wYWNrL2xheWVyLmpzIj48L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvanMvc3BpcF9iYXJyZS5qcyI+PC9zY3JpcHQ+PHRhYmxlIGNsYXNzPSdzcGlwX2JhcnJlJyBzdHlsZT0nd2lkdGg6YXV0bzsnIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCcgYm9yZGVyPScwJyBzdW1tYXJ5PScnPgo8dHIgc3R5bGU9J3dpZHRoOiBhdXRvOycgY2xhc3M9J3NwaXBfYmFycmUnPgo8dGQgc3R5bGU9J3RleHQtYWxpZ246IGxlZnQ7JyB2YWxpZ249J21pZGRsZSc+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ3snLCd9Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGVuIHtpdGFsaXF1ZX0iIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnTWV0dHJlIGVuIHtpdGFsaXF1ZX0nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvaXRhbGlxdWUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGVuIHtpdGFsaXF1ZX0iIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCd7eycsJ319Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGVuIHt7Z3Jhc319IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ01ldHRyZSBlbiB7e2dyYXN9fScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9ncmFzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBlbiB7e2dyYXN9fSIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6c3dhcF9jb3VjaGUoJzInLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJUcmFuc2Zvcm1lciBlbiBbbGllbiBoeXBlcnRleHRlLT5odHRwOi8vLi4uXSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdUcmFuc2Zvcm1lciBlbiBbbGllbiBoeXBlcnRleHRlLT5odHRwOi8vLi4uXScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9saWVuLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IlRyYW5zZm9ybWVyIGVuIFtsaWVuIGh5cGVydGV4dGUtPmh0dHA6Ly8uLi5dIiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJyU1Q24lNUNuJTNDcXVvdGUlM0UnLCclM0MvcXVvdGUlM0UlNUNuJTVDbicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkNpdGVyIHVuIG1lc3NhZ2UiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnQ2l0ZXIgdW4gbWVzc2FnZScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9xdW90ZS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJDaXRlciB1biBtZXNzYWdlIiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQgc3R5bGU9J3RleHQtYWxpZ246bGVmdDsnIHZhbGlnbj0nbWlkZGxlJz48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCc0JywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iQ2FyYWN0JmVncmF2ZTtyZXMgc3AmZWFjdXRlO2NpYXV4IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0NhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9jbGF2aWVyLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkNhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eCIgLz48L2E+Jm5ic3A7PC90ZD48L3RyPgo8dHI+Cjx0ZCBjb2xzcGFuPSc2Jz48aW5wdXQgZGlzYWJsZWQ9J2Rpc2FibGVkJyB0eXBlPSd0ZXh0JyBpZD0nYmFycmVfMScgc2l6ZT0nNDUnIG1heGxlbmd0aD0nMTAwJyBzdHlsZT0nd2lkdGg6YXV0bzsgZm9udC1zaXplOjExcHg7IGNvbG9yOiBibGFjazsgYmFja2dyb3VuZC1jb2xvcjogI2U0ZTRlNDsgYm9yZGVyOiAwcHggc29saWQgI2RlZGVkZTsnCnZhbHVlPSJVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZSIgLz48L3RkPjwvdHI+PC90YWJsZT48ZGl2IGlkPSdMYXllcjEnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+PHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkPg0KTmIgY29sb25uZXM6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9uYmNvbG9uZXMiIHN0eWxlPSJ3aWR0aDogMzBweDsiIHZhbHVlPSIyIiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiICAgLz48L3RkPjx0ZD4NCk5iIGxpZ25lczogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX25icmFuZ3MiIHN0eWxlPSJ3aWR0aDogMzBweDsiIHZhbHVlPSIyIiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiIC8+PC90ZD48dGQ+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImJhcnJlX2RvZW50ZXRlIiB2YWx1ZT0iLTEiIGNoZWNrZWQ9ImNoZWNrZWQiIC8+IEVudGV0ZTwvdGQ+PHRkPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJiYXJyZV9kb2NhcHRpb24iIHZhbHVlPSItMSIgY2hlY2tlZD0iY2hlY2tlZCIgLz4gQ2FwdGlvbiBldCBSJmVhY3V0ZTtzdW0mZWFjdXRlOzwvdGQ+PHRkPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDoNCiAgICBiYXJyZV9uYmNvbG9uZXMudmFsdWUgPSBNYXRoLmFicyhiYXJyZV9uYmNvbG9uZXMudmFsdWUpOyBiYXJyZV9uYnJhbmdzLnZhbHVlDQogICAgPSBNYXRoLmFicyhiYXJyZV9uYnJhbmdzLnZhbHVlKTsNCiAgICBpZiAoIShiYXJyZV9uYmNvbG9uZXMudmFsdWUgPT0gMCB8fCBiYXJyZV9uYnJhbmdzLnZhbHVlID09IDApKSB7DQogICAgYmFycmVfdGFibGVhdShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJyksIGJhcnJlX25iY29sb25lcy52YWx1ZSwgYmFycmVfbmJyYW5ncy52YWx1ZSwNCiAgICBiYXJyZV9kb2VudGV0ZS5jaGVja2VkLCBiYXJyZV9kb2NhcHRpb24uY2hlY2tlZCk7IH0gIiAvPiANCjwvdGQ+PC90cj48L3RhYmxlPg0KPGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjInIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQogPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkPiANCkFkcmVzc2UmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX25vbSIgdmFsdWU9Imh0dHA6Ly8iIHNpemU9IjIxIiBtYXhsZW5ndGg9IjI1NSIgLz48YnIgLz4NCkJ1bGxlIGQnYWlkZSZuYnNwOzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxpZW5fYnVsbGUiIHZhbHVlPSIiIHNpemU9IjIxIiBtYXhsZW5ndGg9IjI1NSIgLz4NCjwvdGQ+PHRkPg0KTGFuZ3VlIGFiciZlYWN1dGU7ZyZlYWN1dGU7ZSZuYnNwOzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxpZW5fbGFuZ3VlIiB2YWx1ZT0iIiBzaXplPSIxMCIgbWF4bGVuZ3RoPSIxMCIgLz4NCjwvdGQ+PHRkPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9kZW1hbmRlX2xpZW4oJ1snLCAnLT4nLCAnXScsIGxpZW5fbm9tLnZhbHVlLCBsaWVuX2J1bGxlLnZhbHVlLCBsaWVuX2xhbmd1ZS52YWx1ZSxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpOyIgLz4gDQo8L3RkPjwvdHI+PC90YWJsZT4NCjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXIzJyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQogIDx0cj4NCiAgICA8dGQgc3R5bGU9IndpZHRoOmF1dG87IHRleHQtYWxpZ246Y2VudGVyOyI+PHN0cm9uZz5HZXN0aW9uIGRlcyBhbmNyZXM8L3N0cm9uZz48L3RkPg0KICAgIDx0ZCBzdHlsZT0id2lkdGg6YXV0bzsiPjxzdHJvbmc+VHJhbnNmb3JtZXIgZW4gYW5jcmU8L3N0cm9uZz48YnIgLz4NCiAgICA8bGFiZWwgZm9yPSJhbmNyZV9ub20iPjxpPk5vbSBkZSBsJ2FuY3JlPC9pPjwvbGFiZWw+IDxiciAvPg0KICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImFuY3JlX25vbSIgaWQ9ImFuY3JlX25vbSIgLz4NCgkgIA0KCTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIiBvbmNsaWNrPSJqYXZhc2NyaXB0OmJhcnJlX2FuY3JlKCdbJywgJzwtJywgJ10nLCBhbmNyZV9ub20udmFsdWUsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSk7IiAvPg0KICAgIDwvdGQ+DQoJPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyI+PHN0cm9uZz5Qb2ludGVyIHZlcnMgdW5lIGFuY3JlPC9zdHJvbmc+PGJyIC8+DQogICAgPGxhYmVsIGZvcj0iYW5jcmVfY2libGUiPjxpPkFuY3JlIGNpYmxlPC9pPjwvbGFiZWw+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9jaWJsZSIgaWQ9ImFuY3JlX2NpYmxlIiAvPjxiciAvPg0KCTxsYWJlbCBmb3I9ImFuY3JlX2J1bGxlIj48aT5CdWxsZSBkJ2FpZGUgYW5jcmU8L2k+PC9sYWJlbD4gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImFuY3JlX2J1bGxlIiBpZD0iYW5jcmVfYnVsbGUiIC8+DQoJPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfZGVtYW5kZSgnWycsICctPiMnLCAnXScsIGFuY3JlX2NpYmxlLnZhbHVlLCBhbmNyZV9idWxsZS52YWx1ZSwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKTsiIC8+IA0KPC90ZD4NCiAgPC90cj4gDQo8L3RhYmxlPjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXI0JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQogIDx0ciBjbGFzcz0ic3BpcF9iYXJyZSI+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDozMCU7Ij5DYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXg8L3RkPg0KICAgIDx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnXHUwMGFificsJ35cdTAwYmInLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJFbnRvdXJlciBkZSAmbGFxdW87IGd1aWxsZW1ldHMgJnJhcXVvOyIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdFbnRvdXJlciBkZSAmbGFxdW87IGd1aWxsZW1ldHMgJnJhcXVvOycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9ndWlsbGVtZXRzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudG91cmVyIGRlICZsYXF1bzsgZ3VpbGxlbWV0cyAmcmFxdW87IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnXHUwMDkzJywnXHUwMDk0Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iRW50b3VyZXIgZGUgJmxkcXVvO2d1aWxsZW1ldHMgZGUgc2Vjb25kIG5pdmVhdSZyZHF1bzsiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnRW50b3VyZXIgZGUgJmxkcXVvO2d1aWxsZW1ldHMgZGUgc2Vjb25kIG5pdmVhdSZyZHF1bzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZ3VpbGxlbWV0cy1zaW1wbGVzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudG91cmVyIGRlICZsZHF1bztndWlsbGVtZXRzIGRlIHNlY29uZCBuaXZlYXUmcmRxdW87IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjMCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEEgYWNjZW50IGdyYXZlIG1hanVzY3VsZSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBBIGFjY2VudCBncmF2ZSBtYWp1c2N1bGUnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvYWdyYXZlLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBBIGFjY2VudCBncmF2ZSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM5Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBhY2NlbnQgYWlndSBtYWp1c2N1bGUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBhY2NlbnQgYWlndSBtYWp1c2N1bGUnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZWFjdXRlLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGFjY2VudCBhaWd1IG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzgnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIG1hanVzY3VsZSBhY2NlbnQgZ3JhdmUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBtYWp1c2N1bGUgYWNjZW50IGdyYXZlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiPjxpbWcgc3JjPSdwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2VhZ3JhdmUtbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgbWFqdXNjdWxlIGFjY2VudCBncmF2ZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwZTYnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsXCdBJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiPjxpbWcgc3JjPSdwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FlbGlnLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM2Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSBtYWp1c2N1bGUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGxcJ0EgbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiPjxpbWcgc3JjPSdwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FlbGlnLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCcmb2VsaWc7Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbFwnTycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9vZWxpZy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJyZPRWxpZzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIG1hanVzY3VsZSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbFwnTyBtYWp1c2N1bGUnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvb2VsaWctbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ08gbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjNycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEMgYyZlYWN1dGU7ZGlsbGUgbWFqdXNjdWxlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEMgYyZlYWN1dGU7ZGlsbGUgbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiPjxpbWcgc3JjPSdwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2NjZWRpbC1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gQyBjJmVhY3V0ZTtkaWxsZSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignJmV1cm87Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgbGUgc3ltYm9sZSAmZXVybzsiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgbGUgc3ltYm9sZSAmZXVybzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZXVyby5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciBsZSBzeW1ib2xlICZldXJvOyIgLz48L2E+Jm5ic3A7DQogICAgPC90ZD4NCiAgPC90cj4gDQo8L3RhYmxlPg0KPGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjUnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQo8dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCjx0cj48dGQgc3R5bGU9IndpZHRoOiAyNSU7Ij5DaGVyY2hlcjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9jaGVyY2hlciIgdmFsdWU9IiIgc2l6ZT0iMTIiIG1heGxlbmd0aD0iMjU1IiAvPjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMjAlOyI+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY19jYXNlIiB2YWx1ZT0ieWVzIiAvPlJlc3BlY3RlciBsYSBjYXNzZTxiciAvPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjX2VudGllciIgdmFsdWU9InllcyIgLz4NCk1vdCBlbnRpZXINCjwvdGQ+PHRkICBzdHlsZT0id2lkdGg6IDI1JTsiPlJlbXBsYWNlcjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9yZW1wbGFjZXIiIHZhbHVlPSIiIHNpemU9IjEyIiBtYXhsZW5ndGg9IjI1NSIgLz4gDQo8L3RkPjx0ZCBzdHlsZT0id2lkdGg6IDIwJTsiPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZWNfdG91dCIgdmFsdWU9InllcyIgLz5Ub3V0IHJlbXBsYWNlcjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMTAlOyI+DQogICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyINCiAgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9zZWFyY2hyZXBsYWNlKGRvY3VtZW50LmZvcm11bGFpcmUuYmFycmVfY2hlcmNoZXIudmFsdWUsIGRvY3VtZW50LmZvcm11bGFpcmUuYmFycmVfcmVtcGxhY2VyLnZhbHVlLCBkb2N1bWVudC5mb3JtdWxhaXJlLnJlY190b3V0LmNoZWNrZWQsIGRvY3VtZW50LmZvcm11bGFpcmUucmVjX2Nhc2UuY2hlY2tlZCwgZG9jdW1lbnQuZm9ybXVsYWlyZS5yZWNfZW50aWVyLmNoZWNrZWQsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKTsiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+PGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj4KCTx0ZXh0YXJlYSBuYW1lPSd0ZXh0ZV8xJyByb3dzPScxMCcgY2xhc3M9J2Zvcm1vICAgJyBjb2xzPSc4MCcKCWlkPSdpbnB1dC0xLXRleHRlXzEnCglvbnNlbGVjdD0nc3RvcmVDYXJldCh0aGlzKTsnCglvbmNsaWNrPSdzdG9yZUNhcmV0KHRoaXMpOycKCW9ua2V5dXA9J3N0b3JlQ2FyZXQodGhpcyk7JwoJb25kYmxjbGljaz0nc3RvcmVDYXJldCh0aGlzKTsnPjwvdGV4dGFyZWE+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgdGV4dGVfMic+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS10ZXh0ZV8yIj5Wb3RyZSBRdWVzdGlvbjwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgIDx0YWJsZSBjbGFzcz0nc3BpcF9iYXJyZScgc3R5bGU9J3dpZHRoOmF1dG87JyBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnIGJvcmRlcj0nMCcgc3VtbWFyeT0nJz4KPHRyIHN0eWxlPSd3aWR0aDogYXV0bzsnIGNsYXNzPSdzcGlwX2JhcnJlJz4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOiBsZWZ0OycgdmFsaWduPSdtaWRkbGUnPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCd7JywnfScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBlbiB7aXRhbGlxdWV9IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ01ldHRyZSBlbiB7aXRhbGlxdWV9Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2l0YWxpcXVlLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBlbiB7aXRhbGlxdWV9IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgne3snLCd9fScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBlbiB7e2dyYXN9fSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdNZXR0cmUgZW4ge3tncmFzfX0nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZ3Jhcy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJNZXR0cmUgZW4ge3tncmFzfX0iIC8+PC9hPiZuYnNwOzwvdGQ+Cjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCc3JywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iVHJhbnNmb3JtZXIgZW4gW2xpZW4gaHlwZXJ0ZXh0ZS0+aHR0cDovLy4uLl0iIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnVHJhbnNmb3JtZXIgZW4gW2xpZW4gaHlwZXJ0ZXh0ZS0+aHR0cDovLy4uLl0nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvbGllbi5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJUcmFuc2Zvcm1lciBlbiBbbGllbiBoeXBlcnRleHRlLT5odHRwOi8vLi4uXSIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCclNUNuJTVDbiUzQ3F1b3RlJTNFJywnJTNDL3F1b3RlJTNFJTVDbiU1Q24nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJDaXRlciB1biBtZXNzYWdlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0NpdGVyIHVuIG1lc3NhZ2UnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvcXVvdGUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iQ2l0ZXIgdW4gbWVzc2FnZSIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOmxlZnQ7JyB2YWxpZ249J21pZGRsZSc+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnOScsJycpOyIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkNhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eCIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdDYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXgnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvY2xhdmllci5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJDYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXgiIC8+PC9hPiZuYnNwOzwvdGQ+PC90cj4KPHRyPgo8dGQgY29sc3Bhbj0nNic+PGlucHV0IGRpc2FibGVkPSdkaXNhYmxlZCcgdHlwZT0ndGV4dCcgaWQ9J2JhcnJlXzInIHNpemU9JzQ1JyBtYXhsZW5ndGg9JzEwMCcgc3R5bGU9J3dpZHRoOmF1dG87IGZvbnQtc2l6ZToxMXB4OyBjb2xvcjogYmxhY2s7IGJhY2tncm91bmQtY29sb3I6ICNlNGU0ZTQ7IGJvcmRlcjogMHB4IHNvbGlkICNkZWRlZGU7Jwp2YWx1ZT0iVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UiIC8+PC90ZD48L3RyPjwvdGFibGU+PGRpdiBpZD0nTGF5ZXI2JyBzdHlsZT0nZGlzcGxheTpub25lOycgPjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KPHRyPjx0ZD4NCk5iIGNvbG9ubmVzOiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYmFycmVfbmJjb2xvbmVzIiBzdHlsZT0id2lkdGg6IDMwcHg7IiB2YWx1ZT0iMiIgc2l6ZT0iMiIgbWF4bGVuZ3RoPSIyIiAgIC8+PC90ZD48dGQ+DQpOYiBsaWduZXM6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9uYnJhbmdzIiBzdHlsZT0id2lkdGg6IDMwcHg7IiB2YWx1ZT0iMiIgc2l6ZT0iMiIgbWF4bGVuZ3RoPSIyIiAvPjwvdGQ+PHRkPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJiYXJyZV9kb2VudGV0ZSIgdmFsdWU9Ii0xIiBjaGVja2VkPSJjaGVja2VkIiAvPiBFbnRldGU8L3RkPjx0ZD4NCjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iYmFycmVfZG9jYXB0aW9uIiB2YWx1ZT0iLTEiIGNoZWNrZWQ9ImNoZWNrZWQiIC8+IENhcHRpb24gZXQgUiZlYWN1dGU7c3VtJmVhY3V0ZTs8L3RkPjx0ZD4NCiAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6DQogICAgYmFycmVfbmJjb2xvbmVzLnZhbHVlID0gTWF0aC5hYnMoYmFycmVfbmJjb2xvbmVzLnZhbHVlKTsgYmFycmVfbmJyYW5ncy52YWx1ZQ0KICAgID0gTWF0aC5hYnMoYmFycmVfbmJyYW5ncy52YWx1ZSk7DQogICAgaWYgKCEoYmFycmVfbmJjb2xvbmVzLnZhbHVlID09IDAgfHwgYmFycmVfbmJyYW5ncy52YWx1ZSA9PSAwKSkgew0KICAgIGJhcnJlX3RhYmxlYXUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpLCBiYXJyZV9uYmNvbG9uZXMudmFsdWUsIGJhcnJlX25icmFuZ3MudmFsdWUsDQogICAgYmFycmVfZG9lbnRldGUuY2hlY2tlZCwgYmFycmVfZG9jYXB0aW9uLmNoZWNrZWQpOyB9ICIgLz4gDQo8L3RkPjwvdHI+PC90YWJsZT4NCjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXI3JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KIDx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KPHRyPjx0ZD4gDQpBZHJlc3NlJm5ic3A7OiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibGllbl9ub20iIHZhbHVlPSJodHRwOi8vIiBzaXplPSIyMSIgbWF4bGVuZ3RoPSIyNTUiIC8+PGJyIC8+DQpCdWxsZSBkJ2FpZGUmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX2J1bGxlIiB2YWx1ZT0iIiBzaXplPSIyMSIgbWF4bGVuZ3RoPSIyNTUiIC8+DQo8L3RkPjx0ZD4NCkxhbmd1ZSBhYnImZWFjdXRlO2cmZWFjdXRlO2UmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX2xhbmd1ZSIgdmFsdWU9IiIgc2l6ZT0iMTAiIG1heGxlbmd0aD0iMTAiIC8+DQo8L3RkPjx0ZD4NCiAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfZGVtYW5kZV9saWVuKCdbJywgJy0+JywgJ10nLCBsaWVuX25vbS52YWx1ZSwgbGllbl9idWxsZS52YWx1ZSwgbGllbl9sYW5ndWUudmFsdWUsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKTsiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+DQo8ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyOCcgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID4NCjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KICA8dHI+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyB0ZXh0LWFsaWduOmNlbnRlcjsiPjxzdHJvbmc+R2VzdGlvbiBkZXMgYW5jcmVzPC9zdHJvbmc+PC90ZD4NCiAgICA8dGQgc3R5bGU9IndpZHRoOmF1dG87Ij48c3Ryb25nPlRyYW5zZm9ybWVyIGVuIGFuY3JlPC9zdHJvbmc+PGJyIC8+DQogICAgPGxhYmVsIGZvcj0iYW5jcmVfbm9tIj48aT5Ob20gZGUgbCdhbmNyZTwvaT48L2xhYmVsPiA8YnIgLz4NCiAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9ub20iIGlkPSJhbmNyZV9ub20iIC8+DQoJICANCgk8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9hbmNyZSgnWycsICc8LScsICddJywgYW5jcmVfbm9tLnZhbHVlLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpOyIgLz4NCiAgICA8L3RkPg0KCTx0ZCBzdHlsZT0id2lkdGg6YXV0bzsiPjxzdHJvbmc+UG9pbnRlciB2ZXJzIHVuZSBhbmNyZTwvc3Ryb25nPjxiciAvPg0KICAgIDxsYWJlbCBmb3I9ImFuY3JlX2NpYmxlIj48aT5BbmNyZSBjaWJsZTwvaT48L2xhYmVsPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYW5jcmVfY2libGUiIGlkPSJhbmNyZV9jaWJsZSIgLz48YnIgLz4NCgk8bGFiZWwgZm9yPSJhbmNyZV9idWxsZSI+PGk+QnVsbGUgZCdhaWRlIGFuY3JlPC9pPjwvbGFiZWw+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9idWxsZSIgaWQ9ImFuY3JlX2J1bGxlIiAvPg0KCTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIiBvbmNsaWNrPSJqYXZhc2NyaXB0OmJhcnJlX2RlbWFuZGUoJ1snLCAnLT4jJywgJ10nLCBhbmNyZV9jaWJsZS52YWx1ZSwgYW5jcmVfYnVsbGUudmFsdWUsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSk7IiAvPiANCjwvdGQ+DQogIDwvdHI+IA0KPC90YWJsZT48ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyOScgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID4NCjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KICA8dHIgY2xhc3M9InNwaXBfYmFycmUiPg0KICAgIDx0ZCBzdHlsZT0id2lkdGg6MzAlOyI+Q2FyYWN0JmVncmF2ZTtyZXMgc3AmZWFjdXRlO2NpYXV4PC90ZD4NCiAgICA8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ1x1MDBhYn4nLCd+XHUwMGJiJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iRW50b3VyZXIgZGUgJmxhcXVvOyBndWlsbGVtZXRzICZyYXF1bzsiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnRW50b3VyZXIgZGUgJmxhcXVvOyBndWlsbGVtZXRzICZyYXF1bzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZ3VpbGxlbWV0cy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJFbnRvdXJlciBkZSAmbGFxdW87IGd1aWxsZW1ldHMgJnJhcXVvOyIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ1x1MDA5MycsJ1x1MDA5NCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkVudG91cmVyIGRlICZsZHF1bztndWlsbGVtZXRzIGRlIHNlY29uZCBuaXZlYXUmcmRxdW87IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0VudG91cmVyIGRlICZsZHF1bztndWlsbGVtZXRzIGRlIHNlY29uZCBuaXZlYXUmcmRxdW87Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2d1aWxsZW1ldHMtc2ltcGxlcy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJFbnRvdXJlciBkZSAmbGRxdW87Z3VpbGxlbWV0cyBkZSBzZWNvbmQgbml2ZWF1JnJkcXVvOyIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzAnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBBIGFjY2VudCBncmF2ZSBtYWp1c2N1bGUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gQSBhY2NlbnQgZ3JhdmUgbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FncmF2ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gQSBhY2NlbnQgZ3JhdmUgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjOScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgYWNjZW50IGFpZ3UgbWFqdXNjdWxlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEUgYWNjZW50IGFpZ3UgbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2VhY3V0ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBhY2NlbnQgYWlndSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM4Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBtYWp1c2N1bGUgYWNjZW50IGdyYXZlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEUgbWFqdXNjdWxlIGFjY2VudCBncmF2ZScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9lYWdyYXZlLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIG1hanVzY3VsZSBhY2NlbnQgZ3JhdmUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGU2Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbFwnQScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9hZWxpZy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjNicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EgbWFqdXNjdWxlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsXCdBIG1hanVzY3VsZScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9hZWxpZy1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignJm9lbGlnOycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ08iIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGxcJ08nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvb2VsaWcucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCcmT0VsaWc7Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyBtYWp1c2N1bGUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGxcJ08gbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL29lbGlnLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzcnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBDIGMmZWFjdXRlO2RpbGxlIG1hanVzY3VsZSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBDIGMmZWFjdXRlO2RpbGxlIG1hanVzY3VsZScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9jY2VkaWwtbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEMgYyZlYWN1dGU7ZGlsbGUgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJyZldXJvOycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIGxlIHN5bWJvbGUgJmV1cm87IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIGxlIHN5bWJvbGUgJmV1cm87Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2V1cm8ucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgbGUgc3ltYm9sZSAmZXVybzsiIC8+PC9hPiZuYnNwOw0KICAgIDwvdGQ+DQogIDwvdHI+IA0KPC90YWJsZT4NCjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXIxMCcgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID4NCjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KPHRyPjx0ZCBzdHlsZT0id2lkdGg6IDI1JTsiPkNoZXJjaGVyPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX2NoZXJjaGVyIiB2YWx1ZT0iIiBzaXplPSIxMiIgbWF4bGVuZ3RoPSIyNTUiIC8+PC90ZD48dGQgc3R5bGU9IndpZHRoOiAyMCU7Ij4NCjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjX2Nhc2UiIHZhbHVlPSJ5ZXMiIC8+UmVzcGVjdGVyIGxhIGNhc3NlPGJyIC8+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZWNfZW50aWVyIiB2YWx1ZT0ieWVzIiAvPg0KTW90IGVudGllcg0KPC90ZD48dGQgIHN0eWxlPSJ3aWR0aDogMjUlOyI+UmVtcGxhY2VyPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX3JlbXBsYWNlciIgdmFsdWU9IiIgc2l6ZT0iMTIiIG1heGxlbmd0aD0iMjU1IiAvPiANCjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMjAlOyI+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY190b3V0IiB2YWx1ZT0ieWVzIiAvPlRvdXQgcmVtcGxhY2VyPC90ZD48dGQgc3R5bGU9IndpZHRoOiAxMCU7Ij4NCiAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIg0KICBvbmNsaWNrPSJqYXZhc2NyaXB0OmJhcnJlX3NlYXJjaHJlcGxhY2UoZG9jdW1lbnQuZm9ybXVsYWlyZS5iYXJyZV9jaGVyY2hlci52YWx1ZSwgZG9jdW1lbnQuZm9ybXVsYWlyZS5iYXJyZV9yZW1wbGFjZXIudmFsdWUsIGRvY3VtZW50LmZvcm11bGFpcmUucmVjX3RvdXQuY2hlY2tlZCwgZG9jdW1lbnQuZm9ybXVsYWlyZS5yZWNfY2FzZS5jaGVja2VkLCBkb2N1bWVudC5mb3JtdWxhaXJlLnJlY19lbnRpZXIuY2hlY2tlZCxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpOyIgLz4gDQo8L3RkPjwvdHI+PC90YWJsZT48ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PgoJPHRleHRhcmVhIG5hbWU9J3RleHRlXzInIHJvd3M9JzEwJyBjbGFzcz0nZm9ybWwgICAnIGNvbHM9JzgwJwoJaWQ9J2lucHV0LTEtdGV4dGVfMicKCW9uc2VsZWN0PSdzdG9yZUNhcmV0KHRoaXMpOycKCW9uY2xpY2s9J3N0b3JlQ2FyZXQodGhpcyk7JwoJb25rZXl1cD0nc3RvcmVDYXJldCh0aGlzKTsnCglvbmRibGNsaWNrPSdzdG9yZUNhcmV0KHRoaXMpOyc+PC90ZXh0YXJlYT4KCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCTxzcGFuIGNsYXNzPSduZXR0b3lldXInPiA8L3NwYW4+CgkJCQoJCTwvZGl2PgoJCgoKIAoJPC9maWVsZHNldD4KCiAKIAoJCgk8cCBzdHlsZT0nZGlzcGxheTpub25lOyc+PGxhYmVsIGZvcj0ibm9ib3Rub2JvdC0xIj5WZXVpbGxleiBsYWlzc2VyIGNlIGNoYW1wIHZpZGUmbmJzcDs6PC9sYWJlbD4KCTxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJub2JvdG5vYm90IiBpZD0ibm9ib3Rub2JvdC0xIiB2YWx1ZT0iIiBzaXplPSIxMCIgLz48L3A+CgkKCTxkaXYgc3R5bGU9J3RleHQtYWxpZ246cmlnaHQnIGNsYXNzPSdzcGlwX2JvdXRvbic+PGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0nVmFsaWRlcicgdmFsdWU9IlZhbGlkZXIiIC8+PC9kaXY+CgoKPHNjcmlwdCBzcmM9Imh0dHA6Ly9wcmVwcm9kLm5vdHJlLXZpbGxlLm5ldC9+c3RzZWIvcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvZm9ybXMvamF2YXNjcmlwdC9qdGlwLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwhLS0KJCgnaW5wdXQuZm9ybW8nKS5iaW5kKCdmb2N1cycsZnVuY3Rpb24oKXskKHRoaXMpLnJlbW92ZUNsYXNzKCdmb3JtbycpLmFkZENsYXNzKCdmb3Jtby1mb2N1cycpO30pOwokKCdpbnB1dC5mb3JtbycpLmJpbmQoJ2JsdXInLGZ1bmN0aW9uKCl7JCh0aGlzKS5yZW1vdmVDbGFzcygnZm9ybW8tZm9jdXMnKS5hZGRDbGFzcygnZm9ybW8nKTt9KTsKJCgnaW5wdXQuZm9ybWwnKS5iaW5kKCdmb2N1cycsZnVuY3Rpb24oKXskKHRoaXMpLnJlbW92ZUNsYXNzKCdmb3JtbCcpLmFkZENsYXNzKCdmb3JtbC1mb2N1cycpO30pOwokKCdpbnB1dC5mb3JtbCcpLmJpbmQoJ2JsdXInLGZ1bmN0aW9uKCl7JCh0aGlzKS5yZW1vdmVDbGFzcygnZm9ybWwtZm9jdXMnKS5hZGRDbGFzcygnZm9ybWwnKTt9KTsKCi8vLS0+PC9zY3JpcHQ+CgoJIAoJPC9mb3JtPgoJCgkKCQoKCjwvZGl2Pg==',
211
+                'balise' => '<div class="base64" title="PGEgbmFtZT0nZm9ybTEnPjwvYT4KPGRpdiBjbGFzcz0nc3BpcF9mb3Jtcyc+Cgo8ZGl2IGNsYXNzPSdzcGlwX2Rlc2NyaXB0aWYnPjwvZGl2PgoKCgoKIAoJIAoJPGZvcm0gbWV0aG9kPSdwb3N0JyBhY3Rpb249J0NvbnRhY3QuaHRtbCNmb3JtMScKCQllbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KCQkKCQk8ZGl2PgoJCQoJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2Fqb3V0X3JlcG9uc2UnIHZhbHVlPScxJyAvPgoJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2lkX2Rvbm5lZScgdmFsdWU9Jy0xMCcgLz4KCQkKCQk8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdyZXRvdXJfZm9ybScgdmFsdWU9JycgLz4KCQkKCQk8L2Rpdj4KCQkJCgoKIAoJIAoJCQoJCSA8ZmllbGRzZXQ+PGxlZ2VuZD5Ob3VzIGNvbnRhY3RlcjwvbGVnZW5kPiAKCQoJIAoJCTxkaXYgY2xhc3M9J3NwaXBfZm9ybV9jaGFtcCBsaWduZV8xJz4KCQkJCgkJCSAKCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWwnPgoJCQkJCSA8bGFiZWwgZm9yPSJpbnB1dC0xLWxpZ25lXzEiPlZvdHJlIE5vbTwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCSAKCQkJCQoJCQkJPGlucHV0IHR5cGU9InRleHRlIiBuYW1lPSdsaWduZV8xJyBpZD0naW5wdXQtMS1saWduZV8xJyB2YWx1ZT0iIiAKCQkJCQkJY2xhc3M9JyAgbGlnbmUgZm9ybWwnIAoJCQkJCQlzaXplPSc0MCcgLz4KCQkJCQoJCQkJCgkJCQkKCQkJCTxzcGFuIGNsYXNzPSduZXR0b3lldXInPiA8L3NwYW4+CgkJCQoJCTwvZGl2PgoJCgoKCiAKCSAKCQkKCQkKCQoJIAoJCTxkaXYgY2xhc3M9J3NwaXBfZm9ybV9jaGFtcCBsaWduZV8yJz4KCQkJCgkJCSAKCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWwnPgoJCQkJCSA8bGFiZWwgZm9yPSJpbnB1dC0xLWxpZ25lXzIiPlZvdHJlIFByw6lub208L2xhYmVsPgoJCQkJCQoJCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWxfb2JsaWdhdG9pcmUnPgoJCQkJCQlbT2JsaWdhdG9pcmVdPC9zcGFuPgoJCQkJCToKCQkJCTwvc3Bhbj4KCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgCgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0ZSIgbmFtZT0nbGlnbmVfMicgaWQ9J2lucHV0LTEtbGlnbmVfMicgdmFsdWU9IiIgCgkJCQkJCWNsYXNzPScgIGxpZ25lIGZvcm1sJyAKCQkJCQkJc2l6ZT0nNDAnIC8+CgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgZW1haWxfMSc+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS1lbWFpbF8xIj5Wb3RyZSBlbWFpbDwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsX2RldGFpbHMnPlZldWlsbGV6IGVudHJlciB1bmUgYWRyZXNzZSBlLW1haWwgdmFsaWRlIChkZSB0eXBlIHZvdXNAZm91cm5pc3NldXIuY29tKS48L3NwYW4+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgCgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0ZSIgbmFtZT0nZW1haWxfMScgaWQ9J2lucHV0LTEtZW1haWxfMScgdmFsdWU9IiIgCgkJCQkJCWNsYXNzPScgIGVtYWlsIGZvcm1sJyAKCQkJCQkJc2l6ZT0nNDAnIC8+CgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgdGV4dGVfMSc+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS10ZXh0ZV8xIj5Wb3RyZSBBZHJlc3NlPC9sYWJlbD4KCQkJCQkKCQkJCQkKCQkJCQk6CgkJCQk8L3NwYW4+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCSAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0icGx1Z2lucy9hZG1pbi8talF1ZXJ5L2ltZ19wYWNrL2xheWVyLmpzIj48L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvanMvc3BpcF9iYXJyZS5qcyI+PC9zY3JpcHQ+PHRhYmxlIGNsYXNzPSdzcGlwX2JhcnJlJyBzdHlsZT0nd2lkdGg6YXV0bzsnIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCcgYm9yZGVyPScwJyBzdW1tYXJ5PScnPgo8dHIgc3R5bGU9J3dpZHRoOiBhdXRvOycgY2xhc3M9J3NwaXBfYmFycmUnPgo8dGQgc3R5bGU9J3RleHQtYWxpZ246IGxlZnQ7JyB2YWxpZ249J21pZGRsZSc+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ3snLCd9Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGVuIHtpdGFsaXF1ZX0iIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnTWV0dHJlIGVuIHtpdGFsaXF1ZX0nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvaXRhbGlxdWUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGVuIHtpdGFsaXF1ZX0iIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCd7eycsJ319Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGVuIHt7Z3Jhc319IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ01ldHRyZSBlbiB7e2dyYXN9fScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9ncmFzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBlbiB7e2dyYXN9fSIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6c3dhcF9jb3VjaGUoJzInLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJUcmFuc2Zvcm1lciBlbiBbbGllbiBoeXBlcnRleHRlLT5odHRwOi8vLi4uXSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdUcmFuc2Zvcm1lciBlbiBbbGllbiBoeXBlcnRleHRlLT5odHRwOi8vLi4uXScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9saWVuLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IlRyYW5zZm9ybWVyIGVuIFtsaWVuIGh5cGVydGV4dGUtPmh0dHA6Ly8uLi5dIiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJyU1Q24lNUNuJTNDcXVvdGUlM0UnLCclM0MvcXVvdGUlM0UlNUNuJTVDbicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkNpdGVyIHVuIG1lc3NhZ2UiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnQ2l0ZXIgdW4gbWVzc2FnZScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9xdW90ZS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJDaXRlciB1biBtZXNzYWdlIiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQgc3R5bGU9J3RleHQtYWxpZ246bGVmdDsnIHZhbGlnbj0nbWlkZGxlJz48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCc0JywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iQ2FyYWN0JmVncmF2ZTtyZXMgc3AmZWFjdXRlO2NpYXV4IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0NhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9jbGF2aWVyLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkNhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eCIgLz48L2E+Jm5ic3A7PC90ZD48L3RyPgo8dHI+Cjx0ZCBjb2xzcGFuPSc2Jz48aW5wdXQgZGlzYWJsZWQ9J2Rpc2FibGVkJyB0eXBlPSd0ZXh0JyBpZD0nYmFycmVfMScgc2l6ZT0nNDUnIG1heGxlbmd0aD0nMTAwJyBzdHlsZT0nd2lkdGg6YXV0bzsgZm9udC1zaXplOjExcHg7IGNvbG9yOiBibGFjazsgYmFja2dyb3VuZC1jb2xvcjogI2U0ZTRlNDsgYm9yZGVyOiAwcHggc29saWQgI2RlZGVkZTsnCnZhbHVlPSJVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZSIgLz48L3RkPjwvdHI+PC90YWJsZT48ZGl2IGlkPSdMYXllcjEnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+PHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkPg0KTmIgY29sb25uZXM6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9uYmNvbG9uZXMiIHN0eWxlPSJ3aWR0aDogMzBweDsiIHZhbHVlPSIyIiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiICAgLz48L3RkPjx0ZD4NCk5iIGxpZ25lczogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX25icmFuZ3MiIHN0eWxlPSJ3aWR0aDogMzBweDsiIHZhbHVlPSIyIiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiIC8+PC90ZD48dGQ+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImJhcnJlX2RvZW50ZXRlIiB2YWx1ZT0iLTEiIGNoZWNrZWQ9ImNoZWNrZWQiIC8+IEVudGV0ZTwvdGQ+PHRkPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJiYXJyZV9kb2NhcHRpb24iIHZhbHVlPSItMSIgY2hlY2tlZD0iY2hlY2tlZCIgLz4gQ2FwdGlvbiBldCBSJmVhY3V0ZTtzdW0mZWFjdXRlOzwvdGQ+PHRkPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDoNCiAgICBiYXJyZV9uYmNvbG9uZXMudmFsdWUgPSBNYXRoLmFicyhiYXJyZV9uYmNvbG9uZXMudmFsdWUpOyBiYXJyZV9uYnJhbmdzLnZhbHVlDQogICAgPSBNYXRoLmFicyhiYXJyZV9uYnJhbmdzLnZhbHVlKTsNCiAgICBpZiAoIShiYXJyZV9uYmNvbG9uZXMudmFsdWUgPT0gMCB8fCBiYXJyZV9uYnJhbmdzLnZhbHVlID09IDApKSB7DQogICAgYmFycmVfdGFibGVhdShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJyksIGJhcnJlX25iY29sb25lcy52YWx1ZSwgYmFycmVfbmJyYW5ncy52YWx1ZSwNCiAgICBiYXJyZV9kb2VudGV0ZS5jaGVja2VkLCBiYXJyZV9kb2NhcHRpb24uY2hlY2tlZCk7IH0gIiAvPiANCjwvdGQ+PC90cj48L3RhYmxlPg0KPGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjInIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQogPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkPiANCkFkcmVzc2UmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX25vbSIgdmFsdWU9Imh0dHA6Ly8iIHNpemU9IjIxIiBtYXhsZW5ndGg9IjI1NSIgLz48YnIgLz4NCkJ1bGxlIGQnYWlkZSZuYnNwOzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxpZW5fYnVsbGUiIHZhbHVlPSIiIHNpemU9IjIxIiBtYXhsZW5ndGg9IjI1NSIgLz4NCjwvdGQ+PHRkPg0KTGFuZ3VlIGFiciZlYWN1dGU7ZyZlYWN1dGU7ZSZuYnNwOzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxpZW5fbGFuZ3VlIiB2YWx1ZT0iIiBzaXplPSIxMCIgbWF4bGVuZ3RoPSIxMCIgLz4NCjwvdGQ+PHRkPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9kZW1hbmRlX2xpZW4oJ1snLCAnLT4nLCAnXScsIGxpZW5fbm9tLnZhbHVlLCBsaWVuX2J1bGxlLnZhbHVlLCBsaWVuX2xhbmd1ZS52YWx1ZSxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpOyIgLz4gDQo8L3RkPjwvdHI+PC90YWJsZT4NCjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXIzJyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQogIDx0cj4NCiAgICA8dGQgc3R5bGU9IndpZHRoOmF1dG87IHRleHQtYWxpZ246Y2VudGVyOyI+PHN0cm9uZz5HZXN0aW9uIGRlcyBhbmNyZXM8L3N0cm9uZz48L3RkPg0KICAgIDx0ZCBzdHlsZT0id2lkdGg6YXV0bzsiPjxzdHJvbmc+VHJhbnNmb3JtZXIgZW4gYW5jcmU8L3N0cm9uZz48YnIgLz4NCiAgICA8bGFiZWwgZm9yPSJhbmNyZV9ub20iPjxpPk5vbSBkZSBsJ2FuY3JlPC9pPjwvbGFiZWw+IDxiciAvPg0KICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImFuY3JlX25vbSIgaWQ9ImFuY3JlX25vbSIgLz4NCgkgIA0KCTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIiBvbmNsaWNrPSJqYXZhc2NyaXB0OmJhcnJlX2FuY3JlKCdbJywgJzwtJywgJ10nLCBhbmNyZV9ub20udmFsdWUsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSk7IiAvPg0KICAgIDwvdGQ+DQoJPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyI+PHN0cm9uZz5Qb2ludGVyIHZlcnMgdW5lIGFuY3JlPC9zdHJvbmc+PGJyIC8+DQogICAgPGxhYmVsIGZvcj0iYW5jcmVfY2libGUiPjxpPkFuY3JlIGNpYmxlPC9pPjwvbGFiZWw+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9jaWJsZSIgaWQ9ImFuY3JlX2NpYmxlIiAvPjxiciAvPg0KCTxsYWJlbCBmb3I9ImFuY3JlX2J1bGxlIj48aT5CdWxsZSBkJ2FpZGUgYW5jcmU8L2k+PC9sYWJlbD4gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImFuY3JlX2J1bGxlIiBpZD0iYW5jcmVfYnVsbGUiIC8+DQoJPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfZGVtYW5kZSgnWycsICctPiMnLCAnXScsIGFuY3JlX2NpYmxlLnZhbHVlLCBhbmNyZV9idWxsZS52YWx1ZSwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKTsiIC8+IA0KPC90ZD4NCiAgPC90cj4gDQo8L3RhYmxlPjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXI0JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQogIDx0ciBjbGFzcz0ic3BpcF9iYXJyZSI+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDozMCU7Ij5DYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXg8L3RkPg0KICAgIDx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnXHUwMGFificsJ35cdTAwYmInLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJFbnRvdXJlciBkZSAmbGFxdW87IGd1aWxsZW1ldHMgJnJhcXVvOyIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdFbnRvdXJlciBkZSAmbGFxdW87IGd1aWxsZW1ldHMgJnJhcXVvOycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9ndWlsbGVtZXRzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudG91cmVyIGRlICZsYXF1bzsgZ3VpbGxlbWV0cyAmcmFxdW87IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnXHUwMDkzJywnXHUwMDk0Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iRW50b3VyZXIgZGUgJmxkcXVvO2d1aWxsZW1ldHMgZGUgc2Vjb25kIG5pdmVhdSZyZHF1bzsiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnRW50b3VyZXIgZGUgJmxkcXVvO2d1aWxsZW1ldHMgZGUgc2Vjb25kIG5pdmVhdSZyZHF1bzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZ3VpbGxlbWV0cy1zaW1wbGVzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudG91cmVyIGRlICZsZHF1bztndWlsbGVtZXRzIGRlIHNlY29uZCBuaXZlYXUmcmRxdW87IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjMCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEEgYWNjZW50IGdyYXZlIG1hanVzY3VsZSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBBIGFjY2VudCBncmF2ZSBtYWp1c2N1bGUnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvYWdyYXZlLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBBIGFjY2VudCBncmF2ZSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM5Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBhY2NlbnQgYWlndSBtYWp1c2N1bGUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBhY2NlbnQgYWlndSBtYWp1c2N1bGUnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZWFjdXRlLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGFjY2VudCBhaWd1IG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzgnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIG1hanVzY3VsZSBhY2NlbnQgZ3JhdmUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBtYWp1c2N1bGUgYWNjZW50IGdyYXZlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiPjxpbWcgc3JjPSdwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2VhZ3JhdmUtbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgbWFqdXNjdWxlIGFjY2VudCBncmF2ZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwZTYnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsXCdBJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiPjxpbWcgc3JjPSdwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FlbGlnLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM2Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSBtYWp1c2N1bGUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGxcJ0EgbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiPjxpbWcgc3JjPSdwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FlbGlnLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCcmb2VsaWc7Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbFwnTycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIj48aW1nIHNyYz0nZWNyaXJlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9vZWxpZy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJyZPRWxpZzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIG1hanVzY3VsZSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbFwnTyBtYWp1c2N1bGUnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvb2VsaWctbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ08gbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjNycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEMgYyZlYWN1dGU7ZGlsbGUgbWFqdXNjdWxlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEMgYyZlYWN1dGU7ZGlsbGUgbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzEnKSkiPjxpbWcgc3JjPSdwbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2NjZWRpbC1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gQyBjJmVhY3V0ZTtkaWxsZSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignJmV1cm87Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgbGUgc3ltYm9sZSAmZXVybzsiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgbGUgc3ltYm9sZSAmZXVybzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8xJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMScpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZXVyby5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciBsZSBzeW1ib2xlICZldXJvOyIgLz48L2E+Jm5ic3A7DQogICAgPC90ZD4NCiAgPC90cj4gDQo8L3RhYmxlPg0KPGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjUnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQo8dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCjx0cj48dGQgc3R5bGU9IndpZHRoOiAyNSU7Ij5DaGVyY2hlcjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9jaGVyY2hlciIgdmFsdWU9IiIgc2l6ZT0iMTIiIG1heGxlbmd0aD0iMjU1IiAvPjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMjAlOyI+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY19jYXNlIiB2YWx1ZT0ieWVzIiAvPlJlc3BlY3RlciBsYSBjYXNzZTxiciAvPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjX2VudGllciIgdmFsdWU9InllcyIgLz4NCk1vdCBlbnRpZXINCjwvdGQ+PHRkICBzdHlsZT0id2lkdGg6IDI1JTsiPlJlbXBsYWNlcjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9yZW1wbGFjZXIiIHZhbHVlPSIiIHNpemU9IjEyIiBtYXhsZW5ndGg9IjI1NSIgLz4gDQo8L3RkPjx0ZCBzdHlsZT0id2lkdGg6IDIwJTsiPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZWNfdG91dCIgdmFsdWU9InllcyIgLz5Ub3V0IHJlbXBsYWNlcjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMTAlOyI+DQogICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyINCiAgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9zZWFyY2hyZXBsYWNlKGRvY3VtZW50LmZvcm11bGFpcmUuYmFycmVfY2hlcmNoZXIudmFsdWUsIGRvY3VtZW50LmZvcm11bGFpcmUuYmFycmVfcmVtcGxhY2VyLnZhbHVlLCBkb2N1bWVudC5mb3JtdWxhaXJlLnJlY190b3V0LmNoZWNrZWQsIGRvY3VtZW50LmZvcm11bGFpcmUucmVjX2Nhc2UuY2hlY2tlZCwgZG9jdW1lbnQuZm9ybXVsYWlyZS5yZWNfZW50aWVyLmNoZWNrZWQsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKTsiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+PGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj4KCTx0ZXh0YXJlYSBuYW1lPSd0ZXh0ZV8xJyByb3dzPScxMCcgY2xhc3M9J2Zvcm1vICAgJyBjb2xzPSc4MCcKCWlkPSdpbnB1dC0xLXRleHRlXzEnCglvbnNlbGVjdD0nc3RvcmVDYXJldCh0aGlzKTsnCglvbmNsaWNrPSdzdG9yZUNhcmV0KHRoaXMpOycKCW9ua2V5dXA9J3N0b3JlQ2FyZXQodGhpcyk7JwoJb25kYmxjbGljaz0nc3RvcmVDYXJldCh0aGlzKTsnPjwvdGV4dGFyZWE+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgdGV4dGVfMic+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS10ZXh0ZV8yIj5Wb3RyZSBRdWVzdGlvbjwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgIDx0YWJsZSBjbGFzcz0nc3BpcF9iYXJyZScgc3R5bGU9J3dpZHRoOmF1dG87JyBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnIGJvcmRlcj0nMCcgc3VtbWFyeT0nJz4KPHRyIHN0eWxlPSd3aWR0aDogYXV0bzsnIGNsYXNzPSdzcGlwX2JhcnJlJz4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOiBsZWZ0OycgdmFsaWduPSdtaWRkbGUnPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCd7JywnfScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBlbiB7aXRhbGlxdWV9IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ01ldHRyZSBlbiB7aXRhbGlxdWV9Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2l0YWxpcXVlLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBlbiB7aXRhbGlxdWV9IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgne3snLCd9fScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBlbiB7e2dyYXN9fSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdNZXR0cmUgZW4ge3tncmFzfX0nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZ3Jhcy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJNZXR0cmUgZW4ge3tncmFzfX0iIC8+PC9hPiZuYnNwOzwvdGQ+Cjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCc3JywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iVHJhbnNmb3JtZXIgZW4gW2xpZW4gaHlwZXJ0ZXh0ZS0+aHR0cDovLy4uLl0iIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnVHJhbnNmb3JtZXIgZW4gW2xpZW4gaHlwZXJ0ZXh0ZS0+aHR0cDovLy4uLl0nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvbGllbi5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJUcmFuc2Zvcm1lciBlbiBbbGllbiBoeXBlcnRleHRlLT5odHRwOi8vLi4uXSIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCclNUNuJTVDbiUzQ3F1b3RlJTNFJywnJTNDL3F1b3RlJTNFJTVDbiU1Q24nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJDaXRlciB1biBtZXNzYWdlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0NpdGVyIHVuIG1lc3NhZ2UnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvcXVvdGUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iQ2l0ZXIgdW4gbWVzc2FnZSIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOmxlZnQ7JyB2YWxpZ249J21pZGRsZSc+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnOScsJycpOyIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkNhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eCIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdDYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXgnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvY2xhdmllci5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJDYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXgiIC8+PC9hPiZuYnNwOzwvdGQ+PC90cj4KPHRyPgo8dGQgY29sc3Bhbj0nNic+PGlucHV0IGRpc2FibGVkPSdkaXNhYmxlZCcgdHlwZT0ndGV4dCcgaWQ9J2JhcnJlXzInIHNpemU9JzQ1JyBtYXhsZW5ndGg9JzEwMCcgc3R5bGU9J3dpZHRoOmF1dG87IGZvbnQtc2l6ZToxMXB4OyBjb2xvcjogYmxhY2s7IGJhY2tncm91bmQtY29sb3I6ICNlNGU0ZTQ7IGJvcmRlcjogMHB4IHNvbGlkICNkZWRlZGU7Jwp2YWx1ZT0iVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UiIC8+PC90ZD48L3RyPjwvdGFibGU+PGRpdiBpZD0nTGF5ZXI2JyBzdHlsZT0nZGlzcGxheTpub25lOycgPjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KPHRyPjx0ZD4NCk5iIGNvbG9ubmVzOiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYmFycmVfbmJjb2xvbmVzIiBzdHlsZT0id2lkdGg6IDMwcHg7IiB2YWx1ZT0iMiIgc2l6ZT0iMiIgbWF4bGVuZ3RoPSIyIiAgIC8+PC90ZD48dGQ+DQpOYiBsaWduZXM6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9uYnJhbmdzIiBzdHlsZT0id2lkdGg6IDMwcHg7IiB2YWx1ZT0iMiIgc2l6ZT0iMiIgbWF4bGVuZ3RoPSIyIiAvPjwvdGQ+PHRkPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJiYXJyZV9kb2VudGV0ZSIgdmFsdWU9Ii0xIiBjaGVja2VkPSJjaGVja2VkIiAvPiBFbnRldGU8L3RkPjx0ZD4NCjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iYmFycmVfZG9jYXB0aW9uIiB2YWx1ZT0iLTEiIGNoZWNrZWQ9ImNoZWNrZWQiIC8+IENhcHRpb24gZXQgUiZlYWN1dGU7c3VtJmVhY3V0ZTs8L3RkPjx0ZD4NCiAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6DQogICAgYmFycmVfbmJjb2xvbmVzLnZhbHVlID0gTWF0aC5hYnMoYmFycmVfbmJjb2xvbmVzLnZhbHVlKTsgYmFycmVfbmJyYW5ncy52YWx1ZQ0KICAgID0gTWF0aC5hYnMoYmFycmVfbmJyYW5ncy52YWx1ZSk7DQogICAgaWYgKCEoYmFycmVfbmJjb2xvbmVzLnZhbHVlID09IDAgfHwgYmFycmVfbmJyYW5ncy52YWx1ZSA9PSAwKSkgew0KICAgIGJhcnJlX3RhYmxlYXUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpLCBiYXJyZV9uYmNvbG9uZXMudmFsdWUsIGJhcnJlX25icmFuZ3MudmFsdWUsDQogICAgYmFycmVfZG9lbnRldGUuY2hlY2tlZCwgYmFycmVfZG9jYXB0aW9uLmNoZWNrZWQpOyB9ICIgLz4gDQo8L3RkPjwvdHI+PC90YWJsZT4NCjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXI3JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KIDx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KPHRyPjx0ZD4gDQpBZHJlc3NlJm5ic3A7OiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibGllbl9ub20iIHZhbHVlPSJodHRwOi8vIiBzaXplPSIyMSIgbWF4bGVuZ3RoPSIyNTUiIC8+PGJyIC8+DQpCdWxsZSBkJ2FpZGUmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX2J1bGxlIiB2YWx1ZT0iIiBzaXplPSIyMSIgbWF4bGVuZ3RoPSIyNTUiIC8+DQo8L3RkPjx0ZD4NCkxhbmd1ZSBhYnImZWFjdXRlO2cmZWFjdXRlO2UmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX2xhbmd1ZSIgdmFsdWU9IiIgc2l6ZT0iMTAiIG1heGxlbmd0aD0iMTAiIC8+DQo8L3RkPjx0ZD4NCiAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfZGVtYW5kZV9saWVuKCdbJywgJy0+JywgJ10nLCBsaWVuX25vbS52YWx1ZSwgbGllbl9idWxsZS52YWx1ZSwgbGllbl9sYW5ndWUudmFsdWUsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKTsiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+DQo8ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyOCcgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID4NCjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KICA8dHI+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyB0ZXh0LWFsaWduOmNlbnRlcjsiPjxzdHJvbmc+R2VzdGlvbiBkZXMgYW5jcmVzPC9zdHJvbmc+PC90ZD4NCiAgICA8dGQgc3R5bGU9IndpZHRoOmF1dG87Ij48c3Ryb25nPlRyYW5zZm9ybWVyIGVuIGFuY3JlPC9zdHJvbmc+PGJyIC8+DQogICAgPGxhYmVsIGZvcj0iYW5jcmVfbm9tIj48aT5Ob20gZGUgbCdhbmNyZTwvaT48L2xhYmVsPiA8YnIgLz4NCiAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9ub20iIGlkPSJhbmNyZV9ub20iIC8+DQoJICANCgk8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9hbmNyZSgnWycsICc8LScsICddJywgYW5jcmVfbm9tLnZhbHVlLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpOyIgLz4NCiAgICA8L3RkPg0KCTx0ZCBzdHlsZT0id2lkdGg6YXV0bzsiPjxzdHJvbmc+UG9pbnRlciB2ZXJzIHVuZSBhbmNyZTwvc3Ryb25nPjxiciAvPg0KICAgIDxsYWJlbCBmb3I9ImFuY3JlX2NpYmxlIj48aT5BbmNyZSBjaWJsZTwvaT48L2xhYmVsPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYW5jcmVfY2libGUiIGlkPSJhbmNyZV9jaWJsZSIgLz48YnIgLz4NCgk8bGFiZWwgZm9yPSJhbmNyZV9idWxsZSI+PGk+QnVsbGUgZCdhaWRlIGFuY3JlPC9pPjwvbGFiZWw+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9idWxsZSIgaWQ9ImFuY3JlX2J1bGxlIiAvPg0KCTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIiBvbmNsaWNrPSJqYXZhc2NyaXB0OmJhcnJlX2RlbWFuZGUoJ1snLCAnLT4jJywgJ10nLCBhbmNyZV9jaWJsZS52YWx1ZSwgYW5jcmVfYnVsbGUudmFsdWUsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSk7IiAvPiANCjwvdGQ+DQogIDwvdHI+IA0KPC90YWJsZT48ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyOScgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID4NCjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KICA8dHIgY2xhc3M9InNwaXBfYmFycmUiPg0KICAgIDx0ZCBzdHlsZT0id2lkdGg6MzAlOyI+Q2FyYWN0JmVncmF2ZTtyZXMgc3AmZWFjdXRlO2NpYXV4PC90ZD4NCiAgICA8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ1x1MDBhYn4nLCd+XHUwMGJiJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iRW50b3VyZXIgZGUgJmxhcXVvOyBndWlsbGVtZXRzICZyYXF1bzsiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnRW50b3VyZXIgZGUgJmxhcXVvOyBndWlsbGVtZXRzICZyYXF1bzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZ3VpbGxlbWV0cy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJFbnRvdXJlciBkZSAmbGFxdW87IGd1aWxsZW1ldHMgJnJhcXVvOyIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ1x1MDA5MycsJ1x1MDA5NCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkVudG91cmVyIGRlICZsZHF1bztndWlsbGVtZXRzIGRlIHNlY29uZCBuaXZlYXUmcmRxdW87IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0VudG91cmVyIGRlICZsZHF1bztndWlsbGVtZXRzIGRlIHNlY29uZCBuaXZlYXUmcmRxdW87Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2d1aWxsZW1ldHMtc2ltcGxlcy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJFbnRvdXJlciBkZSAmbGRxdW87Z3VpbGxlbWV0cyBkZSBzZWNvbmQgbml2ZWF1JnJkcXVvOyIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzAnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBBIGFjY2VudCBncmF2ZSBtYWp1c2N1bGUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gQSBhY2NlbnQgZ3JhdmUgbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FncmF2ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gQSBhY2NlbnQgZ3JhdmUgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjOScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgYWNjZW50IGFpZ3UgbWFqdXNjdWxlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEUgYWNjZW50IGFpZ3UgbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2VhY3V0ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBhY2NlbnQgYWlndSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM4Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBtYWp1c2N1bGUgYWNjZW50IGdyYXZlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEUgbWFqdXNjdWxlIGFjY2VudCBncmF2ZScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9lYWdyYXZlLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIG1hanVzY3VsZSBhY2NlbnQgZ3JhdmUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGU2Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbFwnQScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9hZWxpZy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjNicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EgbWFqdXNjdWxlIiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsXCdBIG1hanVzY3VsZScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9hZWxpZy1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignJm9lbGlnOycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ08iIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGxcJ08nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIiBvbm1vdXNlb3V0PSJoZWxwbGluZSgnVXRpbGlzZXogbGVzIHJhY2NvdXJjaXMgdHlwb2dyYXBoaXF1ZXMgcG91ciBlbnJpY2hpciB2b3RyZSBtaXNlIGVuIHBhZ2UnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSI+PGltZyBzcmM9J2VjcmlyZS9pbWdfcGFjay9pY29uZXNfYmFycmUvb2VsaWcucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCcmT0VsaWc7Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyBtYWp1c2N1bGUiIG9ubW91c2VvdmVyPSJoZWxwbGluZSgnSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGxcJ08gbWFqdXNjdWxlJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL29lbGlnLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzcnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBDIGMmZWFjdXRlO2RpbGxlIG1hanVzY3VsZSIgb25tb3VzZW92ZXI9ImhlbHBsaW5lKCdJbnMmZWFjdXRlO3JlciB1biBDIGMmZWFjdXRlO2RpbGxlIG1hanVzY3VsZScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiIG9ubW91c2VvdXQ9ImhlbHBsaW5lKCdVdGlsaXNleiBsZXMgcmFjY291cmNpcyB0eXBvZ3JhcGhpcXVlcyBwb3VyIGVucmljaGlyIHZvdHJlIG1pc2UgZW4gcGFnZScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXJyZV8yJykpIj48aW1nIHNyYz0ncGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9jY2VkaWwtbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEMgYyZlYWN1dGU7ZGlsbGUgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJyZldXJvOycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIGxlIHN5bWJvbGUgJmV1cm87IiBvbm1vdXNlb3Zlcj0iaGVscGxpbmUoJ0lucyZlYWN1dGU7cmVyIGxlIHN5bWJvbGUgJmV1cm87Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFycmVfMicpKSIgb25tb3VzZW91dD0iaGVscGxpbmUoJ1V0aWxpc2V6IGxlcyByYWNjb3VyY2lzIHR5cG9ncmFwaGlxdWVzIHBvdXIgZW5yaWNoaXIgdm90cmUgbWlzZSBlbiBwYWdlJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcnJlXzInKSkiPjxpbWcgc3JjPSdlY3JpcmUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2V1cm8ucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgbGUgc3ltYm9sZSAmZXVybzsiIC8+PC9hPiZuYnNwOw0KICAgIDwvdGQ+DQogIDwvdHI+IA0KPC90YWJsZT4NCjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXIxMCcgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID4NCjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KPHRyPjx0ZCBzdHlsZT0id2lkdGg6IDI1JTsiPkNoZXJjaGVyPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX2NoZXJjaGVyIiB2YWx1ZT0iIiBzaXplPSIxMiIgbWF4bGVuZ3RoPSIyNTUiIC8+PC90ZD48dGQgc3R5bGU9IndpZHRoOiAyMCU7Ij4NCjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjX2Nhc2UiIHZhbHVlPSJ5ZXMiIC8+UmVzcGVjdGVyIGxhIGNhc3NlPGJyIC8+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZWNfZW50aWVyIiB2YWx1ZT0ieWVzIiAvPg0KTW90IGVudGllcg0KPC90ZD48dGQgIHN0eWxlPSJ3aWR0aDogMjUlOyI+UmVtcGxhY2VyPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX3JlbXBsYWNlciIgdmFsdWU9IiIgc2l6ZT0iMTIiIG1heGxlbmd0aD0iMjU1IiAvPiANCjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMjAlOyI+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY190b3V0IiB2YWx1ZT0ieWVzIiAvPlRvdXQgcmVtcGxhY2VyPC90ZD48dGQgc3R5bGU9IndpZHRoOiAxMCU7Ij4NCiAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIg0KICBvbmNsaWNrPSJqYXZhc2NyaXB0OmJhcnJlX3NlYXJjaHJlcGxhY2UoZG9jdW1lbnQuZm9ybXVsYWlyZS5iYXJyZV9jaGVyY2hlci52YWx1ZSwgZG9jdW1lbnQuZm9ybXVsYWlyZS5iYXJyZV9yZW1wbGFjZXIudmFsdWUsIGRvY3VtZW50LmZvcm11bGFpcmUucmVjX3RvdXQuY2hlY2tlZCwgZG9jdW1lbnQuZm9ybXVsYWlyZS5yZWNfY2FzZS5jaGVja2VkLCBkb2N1bWVudC5mb3JtdWxhaXJlLnJlY19lbnRpZXIuY2hlY2tlZCxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpOyIgLz4gDQo8L3RkPjwvdHI+PC90YWJsZT48ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PgoJPHRleHRhcmVhIG5hbWU9J3RleHRlXzInIHJvd3M9JzEwJyBjbGFzcz0nZm9ybWwgICAnIGNvbHM9JzgwJwoJaWQ9J2lucHV0LTEtdGV4dGVfMicKCW9uc2VsZWN0PSdzdG9yZUNhcmV0KHRoaXMpOycKCW9uY2xpY2s9J3N0b3JlQ2FyZXQodGhpcyk7JwoJb25rZXl1cD0nc3RvcmVDYXJldCh0aGlzKTsnCglvbmRibGNsaWNrPSdzdG9yZUNhcmV0KHRoaXMpOyc+PC90ZXh0YXJlYT4KCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCTxzcGFuIGNsYXNzPSduZXR0b3lldXInPiA8L3NwYW4+CgkJCQoJCTwvZGl2PgoJCgoKIAoJPC9maWVsZHNldD4KCiAKIAoJCgk8cCBzdHlsZT0nZGlzcGxheTpub25lOyc+PGxhYmVsIGZvcj0ibm9ib3Rub2JvdC0xIj5WZXVpbGxleiBsYWlzc2VyIGNlIGNoYW1wIHZpZGUmbmJzcDs6PC9sYWJlbD4KCTxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJub2JvdG5vYm90IiBpZD0ibm9ib3Rub2JvdC0xIiB2YWx1ZT0iIiBzaXplPSIxMCIgLz48L3A+CgkKCTxkaXYgc3R5bGU9J3RleHQtYWxpZ246cmlnaHQnIGNsYXNzPSdzcGlwX2JvdXRvbic+PGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0nVmFsaWRlcicgdmFsdWU9IlZhbGlkZXIiIC8+PC9kaXY+CgoKPHNjcmlwdCBzcmM9Imh0dHA6Ly9wcmVwcm9kLm5vdHJlLXZpbGxlLm5ldC9+c3RzZWIvcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvZm9ybXMvamF2YXNjcmlwdC9qdGlwLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwhLS0KJCgnaW5wdXQuZm9ybW8nKS5iaW5kKCdmb2N1cycsZnVuY3Rpb24oKXskKHRoaXMpLnJlbW92ZUNsYXNzKCdmb3JtbycpLmFkZENsYXNzKCdmb3Jtby1mb2N1cycpO30pOwokKCdpbnB1dC5mb3JtbycpLmJpbmQoJ2JsdXInLGZ1bmN0aW9uKCl7JCh0aGlzKS5yZW1vdmVDbGFzcygnZm9ybW8tZm9jdXMnKS5hZGRDbGFzcygnZm9ybW8nKTt9KTsKJCgnaW5wdXQuZm9ybWwnKS5iaW5kKCdmb2N1cycsZnVuY3Rpb24oKXskKHRoaXMpLnJlbW92ZUNsYXNzKCdmb3JtbCcpLmFkZENsYXNzKCdmb3JtbC1mb2N1cycpO30pOwokKCdpbnB1dC5mb3JtbCcpLmJpbmQoJ2JsdXInLGZ1bmN0aW9uKCl7JCh0aGlzKS5yZW1vdmVDbGFzcygnZm9ybWwtZm9jdXMnKS5hZGRDbGFzcygnZm9ybWwnKTt9KTsKCi8vLS0+PC9zY3JpcHQ+CgoJIAoJPC9mb3JtPgoJCgkKCQoKCjwvZGl2Pg==" ></div>',
212
+                'attribut' => 'title',
213
+            ],
214
+            'base64 #2' => [
215
+                'expected' => 'bW9kZWxlIDogYTo3OntzOjQ6JnF1b3Q7bGFuZyZxdW90OztzOjI6JnF1b3Q7ZnImcXVvdDs7czo0OiZxdW90O2ZvbmQmcXVvdDs7czoxMjomcXVvdDttb2RlbGVzL2Zvcm0mcXVvdDs7czoxMDomcXVvdDtkaXJfcmFjaW5lJnF1b3Q7O3M6MzomcXVvdDsuLi8mcXVvdDs7czoyOiZxdW90O2lkJnF1b3Q7O3M6MTomcXVvdDsxJnF1b3Q7O3M6NzomcXVvdDtpZF9mb3JtJnF1b3Q7O3M6MTomcXVvdDsxJnF1b3Q7O3M6NDomcXVvdDtkYXRlJnF1b3Q7O3M6MTk6JnF1b3Q7MjAwNy0wNS0xMSAxMTo0MjoxOSZxdW90OztzOjEwOiZxdW90O2RhdGVfcmVkYWMmcXVvdDs7czoxOTomcXVvdDsyMDA3LTA1LTExIDExOjQyOjE5JnF1b3Q7O30KCmljaXRvdG8KCjxhIG5hbWU9J2Zvcm0xJz48L2E+CjxkaXYgY2xhc3M9J3NwaXBfZm9ybXMnPgoKPGRpdiBjbGFzcz0nc3BpcF9kZXNjcmlwdGlmJz48L2Rpdj4KCgoKCiAKCQkKCQk8ZGl2PgoJCQo8aW5wdXQgbmFtZT0nZXhlYycgdmFsdWU9J2FydGljbGVzJyB0eXBlPSdoaWRkZW4nIC8+CjxpbnB1dCBuYW1lPSdpZF9hcnRpY2xlJyB2YWx1ZT0nOCcgdHlwZT0naGlkZGVuJyAvPgoJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2Fqb3V0X3JlcG9uc2UnIHZhbHVlPScxJyAvPgoJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2lkX2Rvbm5lZScgdmFsdWU9Jy0xMCcgLz4KCQkKCQk8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdyZXRvdXJfZm9ybScgdmFsdWU9JycgLz4KCQkKCQk8L2Rpdj4KCQkJCgoKIAoJIAoJCQoJCSA8ZmllbGRzZXQ+PGxlZ2VuZD5Ob3VzIGNvbnRhY3RlcjwvbGVnZW5kPiAKCQoJIAoJCTxkaXYgY2xhc3M9J3NwaXBfZm9ybV9jaGFtcCBsaWduZV8xJz4KCQkJCgkJCSAKCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWwnPgoJCQkJCSA8bGFiZWwgZm9yPSJpbnB1dC0xLWxpZ25lXzEiPlZvdHJlIE5vbTwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCSAKCQkJCQoJCQkJPGlucHV0IHR5cGU9InRleHRlIiBuYW1lPSdsaWduZV8xJyBpZD0naW5wdXQtMS1saWduZV8xJyB2YWx1ZT0iIiAKCQkJCQkJY2xhc3M9JyAgbGlnbmUgZm9ybWwnIAoJCQkJCQlzaXplPSc0MCcgLz4KCQkJCQoJCQkJCgkJCQkKCQkJCTxzcGFuIGNsYXNzPSduZXR0b3lldXInPiA8L3NwYW4+CgkJCQoJCTwvZGl2PgoJCgoKCiAKCSAKCQkKCQkKCQoJIAoJCTxkaXYgY2xhc3M9J3NwaXBfZm9ybV9jaGFtcCBsaWduZV8yJz4KCQkJCgkJCSAKCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWwnPgoJCQkJCSA8bGFiZWwgZm9yPSJpbnB1dC0xLWxpZ25lXzIiPlZvdHJlIFByw6lub208L2xhYmVsPgoJCQkJCQoJCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWxfb2JsaWdhdG9pcmUnPgoJCQkJCQlbT2JsaWdhdG9pcmVdPC9zcGFuPgoJCQkJCToKCQkJCTwvc3Bhbj4KCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgCgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0ZSIgbmFtZT0nbGlnbmVfMicgaWQ9J2lucHV0LTEtbGlnbmVfMicgdmFsdWU9IiIgCgkJCQkJCWNsYXNzPScgIGxpZ25lIGZvcm1sJyAKCQkJCQkJc2l6ZT0nNDAnIC8+CgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgZW1haWxfMSc+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS1lbWFpbF8xIj5Wb3RyZSBlbWFpbDwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsX2RldGFpbHMnPlZldWlsbGV6IGVudHJlciB1bmUgYWRyZXNzZSBlLW1haWwgdmFsaWRlIChkZSB0eXBlIHZvdXNAZm91cm5pc3NldXIuY29tKS48L3NwYW4+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgCgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0ZSIgbmFtZT0nZW1haWxfMScgaWQ9J2lucHV0LTEtZW1haWxfMScgdmFsdWU9IiIgCgkJCQkJCWNsYXNzPScgIGVtYWlsIGZvcm1sJyAKCQkJCQkJc2l6ZT0nNDAnIC8+CgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgdGV4dGVfMSc+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS10ZXh0ZV8xIj5Wb3RyZSBBZHJlc3NlPC9sYWJlbD4KCQkJCQkKCQkJCQkKCQkJCQk6CgkJCQk8L3NwYW4+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCSAgPGRpdiBjbGFzcz0iYmFzZTY0amF2YXNjcmlwdDYxNjYyMzIzMDQ2NDQzNDk4YmRmMDE5LjMxMDkxNjM1IiB0aXRsZT0nUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaUlITnlZejBpTGk0dmNHeDFaMmx1Y3k5aFpHMXBiaTh0YWxGMVpYSjVMMmx0WjE5d1lXTnJMMnhoZVdWeUxtcHpJajQ4TDNOamNtbHdkRDQ9JyA+PC9kaXY+Cgo8ZGl2IGNsYXNzPSJiYXNlNjRqYXZhc2NyaXB0NjE2NjIzMjMwNDY0NDM0OThiZGYwMTkuMzEwOTE2MzUiIHRpdGxlPSdQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpSUhOeVl6MGlMaTR2Y0d4MVoybHVjeTltYjI1amRHbHZibTVoYkdsMFpYTXZZbUZ5Y21WZmRIbHdiMTlsWTI5c2IyZHBjWFZsTDJwekwzTndhWEJmWW1GeWNtVXVhbk1pUGp3dmMyTnlhWEIwUGc9PScgPjwvZGl2PgoKPHRhYmxlIGNsYXNzPSdzcGlwX2JhcnJlJyBzdHlsZT0nd2lkdGg6YXV0bzsnIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCcgYm9yZGVyPScwJyBzdW1tYXJ5PScnPgo8dHIgc3R5bGU9J3dpZHRoOiBhdXRvOycgY2xhc3M9J3NwaXBfYmFycmUnPgo8dGQgc3R5bGU9J3RleHQtYWxpZ246IGxlZnQ7JyB2YWxpZ249J21pZGRsZSc+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ3snLCd9Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGVuIHtpdGFsaXF1ZX0iPjxpbWcgc3JjPSdpbWdfcGFjay9pY29uZXNfYmFycmUvaXRhbGlxdWUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGVuIHtpdGFsaXF1ZX0iIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCd7eycsJ319Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGVuIHt7Z3Jhc319Ij48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2dyYXMucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGVuIHt7Z3Jhc319IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnWyonLCcqXScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBsZSB0ZXh0ZSBlbiBbKiZlYWN1dGU7dmlkZW5jZSpdIj48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9taXNlZW5ldmlkZW5jZS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJNZXR0cmUgbGUgdGV4dGUgZW4gWyomZWFjdXRlO3ZpZGVuY2UqXSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJyUzQ3N1cCUzRScsJyUzQy9zdXAlM0UnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJNZXR0cmUgbGUgdGV4dGUgZW4gJmx0O3N1cCZndDtleHBvc2FudCZsdDsvc3VwJmd0OyI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZXhwb3NhbnQucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGxlIHRleHRlIGVuICZsdDtzdXAmZ3Q7ZXhwb3NhbnQmbHQ7L3N1cCZndDsiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCclM0NzYyUzRScsJyUzQy9zYyUzRScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBsZSB0ZXh0ZSBlbiAmbHQ7c2MmZ3Q7cGV0aXRlcyBjYXBpdGFsZXMmbHQ7L3NjJmd0OyI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvcGV0aXRlc2NhcGl0YWxlcy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJNZXR0cmUgbGUgdGV4dGUgZW4gJmx0O3NjJmd0O3BldGl0ZXMgY2FwaXRhbGVzJmx0Oy9zYyZndDsiIC8+PC9hPiZuYnNwOzwvdGQ+Cjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCcxMScsJycpOyIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IlRyYW5zZm9ybWVyIGVuIFtsaWVuIGh5cGVydGV4dGUtPmh0dHA6Ly8uLi5dIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2xpZW4ucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iVHJhbnNmb3JtZXIgZW4gW2xpZW4gaHlwZXJ0ZXh0ZS0+aHR0cDovLy4uLl0iIC8+PC9hPiZuYnNwOzwvdGQ+Cjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnJTVDbiU1Q24lM0NxdW90ZSUzRScsJyUzQy9xdW90ZSUzRSU1Q24lNUNuJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iQ2l0ZXIgdW4gbWVzc2FnZSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9xdW90ZS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJDaXRlciB1biBtZXNzYWdlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnWz8nLCddJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iRW50ciZlYWN1dGU7ZSBkdSBbP2dsb3NzYWlyZV0gKFdpa2lwZWRpYSkiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2JhcnJlLXdpa2kucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iRW50ciZlYWN1dGU7ZSBkdSBbP2dsb3NzYWlyZV0gKFdpa2lwZWRpYSkiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6c3dhcF9jb3VjaGUoJzEwJywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gdGFibGVhdSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvYmFycmUtdGFibGVhdS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biB0YWJsZWF1IiAvPjwvYT4mbmJzcDwvdGQ+Cjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCcxNCcsJycpOyIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkNoZXJjaGVyIFJlbXBsYWNlciI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvY2hlcmNoZXJfcmVtcGxhY2VyLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkNoZXJjaGVyIFJlbXBsYWNlciIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnMTInLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJHZXN0aW9uIGRlcyBhbmNyZXMiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FuY3JlLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ikdlc3Rpb24gZGVzIGFuY3JlcyIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOmxlZnQ7JyB2YWxpZ249J21pZGRsZSc+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnMTMnLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJDYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXgiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2NsYXZpZXIucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iQ2FyYWN0JmVncmF2ZTtyZXMgc3AmZWFjdXRlO2NpYXV4IiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQgc3R5bGU9J3RleHQtYWxpZ246cmlnaHQ7JyB2YWxpZ249J21pZGRsZSc+Jm5ic3A7Jm5ic3A7PGEgY2xhc3M9J2FpZGUnIGhyZWY9J2h0dHA6Ly9wcmVwcm9kLm5vdHJlLXZpbGxlLm5ldC9+c3RzZWIvZWNyaXJlLz9leGVjPWFpZGVfaW5kZXgmYW1wO2FpZGU9cmFjY291cmNpcyZhbXA7dmFyX2xhbmc9ZnInIHRhcmdldD0ic3BpcF9haWRlIiBvbmNsaWNrPSJqYXZhc2NyaXB0OndpbmRvdy5vcGVuKHRoaXMuaHJlZiwnc3BpcF9haWRlJywgJ3Njcm9sbGJhcnM9eWVzLCByZXNpemFibGU9eWVzLCB3aWR0aD03NDAsIGhlaWdodD01ODAnKTsgcmV0dXJuIGZhbHNlOyI+PGltZyBzcmM9J2ltZ19wYWNrL2FpZGUuZ2lmJwphbHQ9IkFJREUiIHRpdGxlPSJEZSBsJ2FpZGUgc3VyIGNldCAmZWFjdXRlO2wmZWFjdXRlO21lbnQiIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgYWxpZ249Im1pZGRsZSIgLz48L2E+Jm5ic3A7PC90ZD48L3RyPjwvdGFibGU+PGRpdiBpZD0nTGF5ZXIxMCcgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID48dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCjx0cj48dGQ+DQpOYiBjb2xvbm5lczogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX25iY29sb25lcyIgc3R5bGU9IndpZHRoOiAzMHB4OyIgdmFsdWU9IjIiIHNpemU9IjIiIG1heGxlbmd0aD0iMiIgICAvPjwvdGQ+PHRkPg0KTmIgbGlnbmVzOiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYmFycmVfbmJyYW5ncyIgc3R5bGU9IndpZHRoOiAzMHB4OyIgdmFsdWU9IjIiIHNpemU9IjIiIG1heGxlbmd0aD0iMiIgLz48L3RkPjx0ZD4NCjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iYmFycmVfZG9lbnRldGUiIHZhbHVlPSItMSIgY2hlY2tlZD0iY2hlY2tlZCIgLz4gRW50ZXRlPC90ZD48dGQ+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImJhcnJlX2RvY2FwdGlvbiIgdmFsdWU9Ii0xIiBjaGVja2VkPSJjaGVja2VkIiAvPiBDYXB0aW9uIGV0IFImZWFjdXRlO3N1bSZlYWN1dGU7PC90ZD48dGQ+DQogIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIiBvbmNsaWNrPSJqYXZhc2NyaXB0Og0KICAgIGJhcnJlX25iY29sb25lcy52YWx1ZSA9IE1hdGguYWJzKGJhcnJlX25iY29sb25lcy52YWx1ZSk7IGJhcnJlX25icmFuZ3MudmFsdWUNCiAgICA9IE1hdGguYWJzKGJhcnJlX25icmFuZ3MudmFsdWUpOw0KICAgIGlmICghKGJhcnJlX25iY29sb25lcy52YWx1ZSA9PSAwIHx8IGJhcnJlX25icmFuZ3MudmFsdWUgPT0gMCkpIHsNCiAgICBiYXJyZV90YWJsZWF1KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSwgYmFycmVfbmJjb2xvbmVzLnZhbHVlLCBiYXJyZV9uYnJhbmdzLnZhbHVlLA0KICAgIGJhcnJlX2RvZW50ZXRlLmNoZWNrZWQsIGJhcnJlX2RvY2FwdGlvbi5jaGVja2VkKTsgfSAiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+DQo8ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyMTEnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQogPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkPiANCkFkcmVzc2UmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX25vbSIgdmFsdWU9Imh0dHA6Ly8iIHNpemU9IjIxIiBtYXhsZW5ndGg9IjI1NSIgLz48YnIgLz4NCkJ1bGxlIGQnYWlkZSZuYnNwOzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxpZW5fYnVsbGUiIHZhbHVlPSIiIHNpemU9IjIxIiBtYXhsZW5ndGg9IjI1NSIgLz4NCjwvdGQ+PHRkPg0KTGFuZ3VlIGFiciZlYWN1dGU7ZyZlYWN1dGU7ZSZuYnNwOzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxpZW5fbGFuZ3VlIiB2YWx1ZT0iIiBzaXplPSIxMCIgbWF4bGVuZ3RoPSIxMCIgLz4NCjwvdGQ+PHRkPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9kZW1hbmRlX2xpZW4oJ1snLCAnLT4nLCAnXScsIGxpZW5fbm9tLnZhbHVlLCBsaWVuX2J1bGxlLnZhbHVlLCBsaWVuX2xhbmd1ZS52YWx1ZSxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpOyIgLz4gDQo8L3RkPjwvdHI+PC90YWJsZT4NCjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXIxMicgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID4NCjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KICA8dHI+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyB0ZXh0LWFsaWduOmNlbnRlcjsiPjxzdHJvbmc+R2VzdGlvbiBkZXMgYW5jcmVzPC9zdHJvbmc+PC90ZD4NCiAgICA8dGQgc3R5bGU9IndpZHRoOmF1dG87Ij48c3Ryb25nPlRyYW5zZm9ybWVyIGVuIGFuY3JlPC9zdHJvbmc+PGJyIC8+DQogICAgPGxhYmVsIGZvcj0iYW5jcmVfbm9tIj48aT5Ob20gZGUgbCdhbmNyZTwvaT48L2xhYmVsPiA8YnIgLz4NCiAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9ub20iIGlkPSJhbmNyZV9ub20iIC8+DQoJICANCgk8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9hbmNyZSgnWycsICc8LScsICddJywgYW5jcmVfbm9tLnZhbHVlLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpOyIgLz4NCiAgICA8L3RkPg0KCTx0ZCBzdHlsZT0id2lkdGg6YXV0bzsiPjxzdHJvbmc+UG9pbnRlciB2ZXJzIHVuZSBhbmNyZTwvc3Ryb25nPjxiciAvPg0KICAgIDxsYWJlbCBmb3I9ImFuY3JlX2NpYmxlIj48aT5BbmNyZSBjaWJsZTwvaT48L2xhYmVsPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYW5jcmVfY2libGUiIGlkPSJhbmNyZV9jaWJsZSIgLz48YnIgLz4NCgk8bGFiZWwgZm9yPSJhbmNyZV9idWxsZSI+PGk+QnVsbGUgZCdhaWRlIGFuY3JlPC9pPjwvbGFiZWw+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9idWxsZSIgaWQ9ImFuY3JlX2J1bGxlIiAvPg0KCTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIiBvbmNsaWNrPSJqYXZhc2NyaXB0OmJhcnJlX2RlbWFuZGUoJ1snLCAnLT4jJywgJ10nLCBhbmNyZV9jaWJsZS52YWx1ZSwgYW5jcmVfYnVsbGUudmFsdWUsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSk7IiAvPiANCjwvdGQ+DQogIDwvdHI+IA0KPC90YWJsZT48ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyMTMnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQo8dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCiAgPHRyIGNsYXNzPSJzcGlwX2JhcnJlIj4NCiAgICA8dGQgc3R5bGU9IndpZHRoOjMwJTsiPkNhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eDwvdGQ+DQogICAgPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCdcdTAwYWJ+Jywnflx1MDBiYicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkVudG91cmVyIGRlICZsYXF1bzsgZ3VpbGxlbWV0cyAmcmFxdW87Ij48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2d1aWxsZW1ldHMucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iRW50b3VyZXIgZGUgJmxhcXVvOyBndWlsbGVtZXRzICZyYXF1bzsiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCdcdTAwOTMnLCdcdTAwOTQnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJFbnRvdXJlciBkZSAmbGRxdW87Z3VpbGxlbWV0cyBkZSBzZWNvbmQgbml2ZWF1JnJkcXVvOyI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9ndWlsbGVtZXRzLXNpbXBsZXMucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iRW50b3VyZXIgZGUgJmxkcXVvO2d1aWxsZW1ldHMgZGUgc2Vjb25kIG5pdmVhdSZyZHF1bzsiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGMwJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gQSBhY2NlbnQgZ3JhdmUgbWFqdXNjdWxlIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2FncmF2ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gQSBhY2NlbnQgZ3JhdmUgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjOScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgYWNjZW50IGFpZ3UgbWFqdXNjdWxlIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2VhY3V0ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBhY2NlbnQgYWlndSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM4Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBtYWp1c2N1bGUgYWNjZW50IGdyYXZlIj48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9lYWdyYXZlLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIG1hanVzY3VsZSBhY2NlbnQgZ3JhdmUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGU2Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvYWVsaWcucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzYnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIG1hanVzY3VsZSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvYWVsaWctbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJyZvZWxpZzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL29lbGlnLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ08iIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignJk9FbGlnOycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ08gbWFqdXNjdWxlIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL29lbGlnLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzcnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBDIGMmZWFjdXRlO2RpbGxlIG1hanVzY3VsZSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvY2NlZGlsLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBDIGMmZWFjdXRlO2RpbGxlIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCcmZXVybzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciBsZSBzeW1ib2xlICZldXJvOyI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9ldXJvLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIGxlIHN5bWJvbGUgJmV1cm87IiAvPjwvYT4mbmJzcDsNCiAgICA8L3RkPg0KICA8L3RyPiANCjwvdGFibGU+DQo8ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyMTQnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQo8dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCjx0cj48dGQgc3R5bGU9IndpZHRoOiAyNSU7Ij5DaGVyY2hlcjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9jaGVyY2hlciIgdmFsdWU9IiIgc2l6ZT0iMTIiIG1heGxlbmd0aD0iMjU1IiAvPjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMjAlOyI+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY19jYXNlIiB2YWx1ZT0ieWVzIiAvPlJlc3BlY3RlciBsYSBjYXNzZTxiciAvPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjX2VudGllciIgdmFsdWU9InllcyIgLz4NCk1vdCBlbnRpZXINCjwvdGQ+PHRkICBzdHlsZT0id2lkdGg6IDI1JTsiPlJlbXBsYWNlcjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9yZW1wbGFjZXIiIHZhbHVlPSIiIHNpemU9IjEyIiBtYXhsZW5ndGg9IjI1NSIgLz4gDQo8L3RkPjx0ZCBzdHlsZT0id2lkdGg6IDIwJTsiPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZWNfdG91dCIgdmFsdWU9InllcyIgLz5Ub3V0IHJlbXBsYWNlcjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMTAlOyI+DQogICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyINCiAgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9zZWFyY2hyZXBsYWNlKGRvY3VtZW50LmZvcm11bGFpcmUuYmFycmVfY2hlcmNoZXIudmFsdWUsIGRvY3VtZW50LmZvcm11bGFpcmUuYmFycmVfcmVtcGxhY2VyLnZhbHVlLCBkb2N1bWVudC5mb3JtdWxhaXJlLnJlY190b3V0LmNoZWNrZWQsIGRvY3VtZW50LmZvcm11bGFpcmUucmVjX2Nhc2UuY2hlY2tlZCwgZG9jdW1lbnQuZm9ybXVsYWlyZS5yZWNfZW50aWVyLmNoZWNrZWQsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKTsiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+PGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj4KCTx0ZXh0YXJlYSBuYW1lPSd0ZXh0ZV8xJyByb3dzPScxMCcgY2xhc3M9J2Zvcm1vICAgJyBjb2xzPSc4MCcKCWlkPSdpbnB1dC0xLXRleHRlXzEnCglvbnNlbGVjdD0nc3RvcmVDYXJldCh0aGlzKTsnCglvbmNsaWNrPSdzdG9yZUNhcmV0KHRoaXMpOycKCW9ua2V5dXA9J3N0b3JlQ2FyZXQodGhpcyk7JwoJb25kYmxjbGljaz0nc3RvcmVDYXJldCh0aGlzKTsnPjwvdGV4dGFyZWE+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgdGV4dGVfMic+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS10ZXh0ZV8yIj5Wb3RyZSBRdWVzdGlvbjwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgIDx0YWJsZSBjbGFzcz0nc3BpcF9iYXJyZScgc3R5bGU9J3dpZHRoOmF1dG87JyBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnIGJvcmRlcj0nMCcgc3VtbWFyeT0nJz4KPHRyIHN0eWxlPSd3aWR0aDogYXV0bzsnIGNsYXNzPSdzcGlwX2JhcnJlJz4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOiBsZWZ0OycgdmFsaWduPSdtaWRkbGUnPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCd7JywnfScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBlbiB7aXRhbGlxdWV9Ij48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2l0YWxpcXVlLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBlbiB7aXRhbGlxdWV9IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgne3snLCd9fScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBlbiB7e2dyYXN9fSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9ncmFzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBlbiB7e2dyYXN9fSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ1sqJywnKl0nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJNZXR0cmUgbGUgdGV4dGUgZW4gWyomZWFjdXRlO3ZpZGVuY2UqXSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvbWlzZWVuZXZpZGVuY2UucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGxlIHRleHRlIGVuIFsqJmVhY3V0ZTt2aWRlbmNlKl0iIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCclM0NzdXAlM0UnLCclM0Mvc3VwJTNFJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGxlIHRleHRlIGVuICZsdDtzdXAmZ3Q7ZXhwb3NhbnQmbHQ7L3N1cCZndDsiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2V4cG9zYW50LnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBsZSB0ZXh0ZSBlbiAmbHQ7c3VwJmd0O2V4cG9zYW50Jmx0Oy9zdXAmZ3Q7IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnJTNDc2MlM0UnLCclM0Mvc2MlM0UnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJNZXR0cmUgbGUgdGV4dGUgZW4gJmx0O3NjJmd0O3BldGl0ZXMgY2FwaXRhbGVzJmx0Oy9zYyZndDsiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL3BldGl0ZXNjYXBpdGFsZXMucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGxlIHRleHRlIGVuICZsdDtzYyZndDtwZXRpdGVzIGNhcGl0YWxlcyZsdDsvc2MmZ3Q7IiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnMTYnLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJUcmFuc2Zvcm1lciBlbiBbbGllbiBoeXBlcnRleHRlLT5odHRwOi8vLi4uXSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9saWVuLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IlRyYW5zZm9ybWVyIGVuIFtsaWVuIGh5cGVydGV4dGUtPmh0dHA6Ly8uLi5dIiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJyU1Q24lNUNuJTNDcXVvdGUlM0UnLCclM0MvcXVvdGUlM0UlNUNuJTVDbicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkNpdGVyIHVuIG1lc3NhZ2UiPjxpbWcgc3JjPSdpbWdfcGFjay9pY29uZXNfYmFycmUvcXVvdGUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iQ2l0ZXIgdW4gbWVzc2FnZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ1s/JywnXScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkVudHImZWFjdXRlO2UgZHUgWz9nbG9zc2FpcmVdIChXaWtpcGVkaWEpIj48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9iYXJyZS13aWtpLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudHImZWFjdXRlO2UgZHUgWz9nbG9zc2FpcmVdIChXaWtpcGVkaWEpIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCcxNScsJycpOyIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIHRhYmxlYXUiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2JhcnJlLXRhYmxlYXUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gdGFibGVhdSIgLz48L2E+Jm5ic3A8L3RkPgo8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnMTknLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJDaGVyY2hlciBSZW1wbGFjZXIiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2NoZXJjaGVyX3JlbXBsYWNlci5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJDaGVyY2hlciBSZW1wbGFjZXIiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6c3dhcF9jb3VjaGUoJzE3JywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iR2VzdGlvbiBkZXMgYW5jcmVzIj48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9hbmNyZS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJHZXN0aW9uIGRlcyBhbmNyZXMiIC8+PC9hPiZuYnNwOzwvdGQ+Cjx0ZCBzdHlsZT0ndGV4dC1hbGlnbjpsZWZ0OycgdmFsaWduPSdtaWRkbGUnPjxhIGhyZWY9ImphdmFzY3JpcHQ6c3dhcF9jb3VjaGUoJzE4JywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iQ2FyYWN0JmVncmF2ZTtyZXMgc3AmZWFjdXRlO2NpYXV4Ij48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9jbGF2aWVyLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkNhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eCIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOnJpZ2h0OycgdmFsaWduPSdtaWRkbGUnPiZuYnNwOyZuYnNwOzxhIGNsYXNzPSdhaWRlJyBocmVmPSdodHRwOi8vcHJlcHJvZC5ub3RyZS12aWxsZS5uZXQvfnN0c2ViL2VjcmlyZS8/ZXhlYz1haWRlX2luZGV4JmFtcDthaWRlPXJhY2NvdXJjaXMmYW1wO3Zhcl9sYW5nPWZyJyB0YXJnZXQ9InNwaXBfYWlkZSIgb25jbGljaz0iamF2YXNjcmlwdDp3aW5kb3cub3Blbih0aGlzLmhyZWYsJ3NwaXBfYWlkZScsICdzY3JvbGxiYXJzPXllcywgcmVzaXphYmxlPXllcywgd2lkdGg9NzQwLCBoZWlnaHQ9NTgwJyk7IHJldHVybiBmYWxzZTsiPjxpbWcgc3JjPSdpbWdfcGFjay9haWRlLmdpZicKYWx0PSJBSURFIiB0aXRsZT0iRGUgbCdhaWRlIHN1ciBjZXQgJmVhY3V0ZTtsJmVhY3V0ZTttZW50IiB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIGFsaWduPSJtaWRkbGUiIC8+PC9hPiZuYnNwOzwvdGQ+PC90cj48L3RhYmxlPjxkaXYgaWQ9J0xheWVyMTUnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+PHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkPg0KTmIgY29sb25uZXM6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9uYmNvbG9uZXMiIHN0eWxlPSJ3aWR0aDogMzBweDsiIHZhbHVlPSIyIiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiICAgLz48L3RkPjx0ZD4NCk5iIGxpZ25lczogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX25icmFuZ3MiIHN0eWxlPSJ3aWR0aDogMzBweDsiIHZhbHVlPSIyIiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiIC8+PC90ZD48dGQ+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImJhcnJlX2RvZW50ZXRlIiB2YWx1ZT0iLTEiIGNoZWNrZWQ9ImNoZWNrZWQiIC8+IEVudGV0ZTwvdGQ+PHRkPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJiYXJyZV9kb2NhcHRpb24iIHZhbHVlPSItMSIgY2hlY2tlZD0iY2hlY2tlZCIgLz4gQ2FwdGlvbiBldCBSJmVhY3V0ZTtzdW0mZWFjdXRlOzwvdGQ+PHRkPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDoNCiAgICBiYXJyZV9uYmNvbG9uZXMudmFsdWUgPSBNYXRoLmFicyhiYXJyZV9uYmNvbG9uZXMudmFsdWUpOyBiYXJyZV9uYnJhbmdzLnZhbHVlDQogICAgPSBNYXRoLmFicyhiYXJyZV9uYnJhbmdzLnZhbHVlKTsNCiAgICBpZiAoIShiYXJyZV9uYmNvbG9uZXMudmFsdWUgPT0gMCB8fCBiYXJyZV9uYnJhbmdzLnZhbHVlID09IDApKSB7DQogICAgYmFycmVfdGFibGVhdShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJyksIGJhcnJlX25iY29sb25lcy52YWx1ZSwgYmFycmVfbmJyYW5ncy52YWx1ZSwNCiAgICBiYXJyZV9kb2VudGV0ZS5jaGVja2VkLCBiYXJyZV9kb2NhcHRpb24uY2hlY2tlZCk7IH0gIiAvPiANCjwvdGQ+PC90cj48L3RhYmxlPg0KPGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjE2JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KIDx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KPHRyPjx0ZD4gDQpBZHJlc3NlJm5ic3A7OiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibGllbl9ub20iIHZhbHVlPSJodHRwOi8vIiBzaXplPSIyMSIgbWF4bGVuZ3RoPSIyNTUiIC8+PGJyIC8+DQpCdWxsZSBkJ2FpZGUmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX2J1bGxlIiB2YWx1ZT0iIiBzaXplPSIyMSIgbWF4bGVuZ3RoPSIyNTUiIC8+DQo8L3RkPjx0ZD4NCkxhbmd1ZSBhYnImZWFjdXRlO2cmZWFjdXRlO2UmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX2xhbmd1ZSIgdmFsdWU9IiIgc2l6ZT0iMTAiIG1heGxlbmd0aD0iMTAiIC8+DQo8L3RkPjx0ZD4NCiAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfZGVtYW5kZV9saWVuKCdbJywgJy0+JywgJ10nLCBsaWVuX25vbS52YWx1ZSwgbGllbl9idWxsZS52YWx1ZSwgbGllbl9sYW5ndWUudmFsdWUsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKTsiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+DQo8ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyMTcnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQo8dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCiAgPHRyPg0KICAgIDx0ZCBzdHlsZT0id2lkdGg6YXV0bzsgdGV4dC1hbGlnbjpjZW50ZXI7Ij48c3Ryb25nPkdlc3Rpb24gZGVzIGFuY3Jlczwvc3Ryb25nPjwvdGQ+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyI+PHN0cm9uZz5UcmFuc2Zvcm1lciBlbiBhbmNyZTwvc3Ryb25nPjxiciAvPg0KICAgIDxsYWJlbCBmb3I9ImFuY3JlX25vbSI+PGk+Tm9tIGRlIGwnYW5jcmU8L2k+PC9sYWJlbD4gPGJyIC8+DQogICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYW5jcmVfbm9tIiBpZD0iYW5jcmVfbm9tIiAvPg0KCSAgDQoJPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfYW5jcmUoJ1snLCAnPC0nLCAnXScsIGFuY3JlX25vbS52YWx1ZSwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKTsiIC8+DQogICAgPC90ZD4NCgk8dGQgc3R5bGU9IndpZHRoOmF1dG87Ij48c3Ryb25nPlBvaW50ZXIgdmVycyB1bmUgYW5jcmU8L3N0cm9uZz48YnIgLz4NCiAgICA8bGFiZWwgZm9yPSJhbmNyZV9jaWJsZSI+PGk+QW5jcmUgY2libGU8L2k+PC9sYWJlbD4gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImFuY3JlX2NpYmxlIiBpZD0iYW5jcmVfY2libGUiIC8+PGJyIC8+DQoJPGxhYmVsIGZvcj0iYW5jcmVfYnVsbGUiPjxpPkJ1bGxlIGQnYWlkZSBhbmNyZTwvaT48L2xhYmVsPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYW5jcmVfYnVsbGUiIGlkPSJhbmNyZV9idWxsZSIgLz4NCgk8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9kZW1hbmRlKCdbJywgJy0+IycsICddJywgYW5jcmVfY2libGUudmFsdWUsIGFuY3JlX2J1bGxlLnZhbHVlLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpOyIgLz4gDQo8L3RkPg0KICA8L3RyPiANCjwvdGFibGU+PGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjE4JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQogIDx0ciBjbGFzcz0ic3BpcF9iYXJyZSI+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDozMCU7Ij5DYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXg8L3RkPg0KICAgIDx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnXHUwMGFificsJ35cdTAwYmInLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJFbnRvdXJlciBkZSAmbGFxdW87IGd1aWxsZW1ldHMgJnJhcXVvOyI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9ndWlsbGVtZXRzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudG91cmVyIGRlICZsYXF1bzsgZ3VpbGxlbWV0cyAmcmFxdW87IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnXHUwMDkzJywnXHUwMDk0Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iRW50b3VyZXIgZGUgJmxkcXVvO2d1aWxsZW1ldHMgZGUgc2Vjb25kIG5pdmVhdSZyZHF1bzsiPjxpbWcgc3JjPSdpbWdfcGFjay9pY29uZXNfYmFycmUvZ3VpbGxlbWV0cy1zaW1wbGVzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudG91cmVyIGRlICZsZHF1bztndWlsbGVtZXRzIGRlIHNlY29uZCBuaXZlYXUmcmRxdW87IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjMCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEEgYWNjZW50IGdyYXZlIG1hanVzY3VsZSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9hZ3JhdmUtbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEEgYWNjZW50IGdyYXZlIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzknLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGFjY2VudCBhaWd1IG1hanVzY3VsZSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9lYWN1dGUtbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgYWNjZW50IGFpZ3UgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjOCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgbWFqdXNjdWxlIGFjY2VudCBncmF2ZSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZWFncmF2ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBtYWp1c2N1bGUgYWNjZW50IGdyYXZlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBlNicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FlbGlnLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM2Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSBtYWp1c2N1bGUiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FlbGlnLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCcmb2VsaWc7Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9vZWxpZy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJyZPRWxpZzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIG1hanVzY3VsZSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9vZWxpZy1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM3Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gQyBjJmVhY3V0ZTtkaWxsZSBtYWp1c2N1bGUiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2NjZWRpbC1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gQyBjJmVhY3V0ZTtkaWxsZSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignJmV1cm87Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgbGUgc3ltYm9sZSAmZXVybzsiPjxpbWcgc3JjPSdpbWdfcGFjay9pY29uZXNfYmFycmUvZXVyby5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciBsZSBzeW1ib2xlICZldXJvOyIgLz48L2E+Jm5ic3A7DQogICAgPC90ZD4NCiAgPC90cj4gDQo8L3RhYmxlPg0KPGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjE5JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkIHN0eWxlPSJ3aWR0aDogMjUlOyI+Q2hlcmNoZXI8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYmFycmVfY2hlcmNoZXIiIHZhbHVlPSIiIHNpemU9IjEyIiBtYXhsZW5ndGg9IjI1NSIgLz48L3RkPjx0ZCBzdHlsZT0id2lkdGg6IDIwJTsiPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZWNfY2FzZSIgdmFsdWU9InllcyIgLz5SZXNwZWN0ZXIgbGEgY2Fzc2U8YnIgLz48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY19lbnRpZXIiIHZhbHVlPSJ5ZXMiIC8+DQpNb3QgZW50aWVyDQo8L3RkPjx0ZCAgc3R5bGU9IndpZHRoOiAyNSU7Ij5SZW1wbGFjZXI8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYmFycmVfcmVtcGxhY2VyIiB2YWx1ZT0iIiBzaXplPSIxMiIgbWF4bGVuZ3RoPSIyNTUiIC8+IA0KPC90ZD48dGQgc3R5bGU9IndpZHRoOiAyMCU7Ij4NCjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjX3RvdXQiIHZhbHVlPSJ5ZXMiIC8+VG91dCByZW1wbGFjZXI8L3RkPjx0ZCBzdHlsZT0id2lkdGg6IDEwJTsiPg0KICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iDQogIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfc2VhcmNocmVwbGFjZShkb2N1bWVudC5mb3JtdWxhaXJlLmJhcnJlX2NoZXJjaGVyLnZhbHVlLCBkb2N1bWVudC5mb3JtdWxhaXJlLmJhcnJlX3JlbXBsYWNlci52YWx1ZSwgZG9jdW1lbnQuZm9ybXVsYWlyZS5yZWNfdG91dC5jaGVja2VkLCBkb2N1bWVudC5mb3JtdWxhaXJlLnJlY19jYXNlLmNoZWNrZWQsIGRvY3VtZW50LmZvcm11bGFpcmUucmVjX2VudGllci5jaGVja2VkLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSk7IiAvPiANCjwvdGQ+PC90cj48L3RhYmxlPjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+Cgk8dGV4dGFyZWEgbmFtZT0ndGV4dGVfMicgcm93cz0nMTAnIGNsYXNzPSdmb3JtbCAgICcgY29scz0nODAnCglpZD0naW5wdXQtMS10ZXh0ZV8yJwoJb25zZWxlY3Q9J3N0b3JlQ2FyZXQodGhpcyk7JwoJb25jbGljaz0nc3RvcmVDYXJldCh0aGlzKTsnCglvbmtleXVwPSdzdG9yZUNhcmV0KHRoaXMpOycKCW9uZGJsY2xpY2s9J3N0b3JlQ2FyZXQodGhpcyk7Jz48L3RleHRhcmVhPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJPHNwYW4gY2xhc3M9J25ldHRveWV1cic+IDwvc3Bhbj4KCQkJCgkJPC9kaXY+CgkKCgogCgk8L2ZpZWxkc2V0PgoKIAogCgkKCTxwIHN0eWxlPSdkaXNwbGF5Om5vbmU7Jz48bGFiZWwgZm9yPSJub2JvdG5vYm90LTEiPlZldWlsbGV6IGxhaXNzZXIgY2UgY2hhbXAgdmlkZSZuYnNwOzo8L2xhYmVsPgoJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im5vYm90bm9ib3QiIGlkPSJub2JvdG5vYm90LTEiIHZhbHVlPSIiIHNpemU9IjEwIiAvPjwvcD4KCQoJPGRpdiBzdHlsZT0ndGV4dC1hbGlnbjpyaWdodCcgY2xhc3M9J3NwaXBfYm91dG9uJz48aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSdWYWxpZGVyJyB2YWx1ZT0iVmFsaWRlciIgLz48L2Rpdj4KCgo8ZGl2IGNsYXNzPSJiYXNlNjRqYXZhc2NyaXB0NjE2NjIzMjMwNDY0NDM0OThiZGYwMTkuMzEwOTE2MzUiIHRpdGxlPSdQSE5qY21sd2RDQnpjbU05SW1oMGRIQTZMeTl3Y21Wd2NtOWtMbTV2ZEhKbExYWnBiR3hsTG01bGRDOStjM1J6WldJdmNHeDFaMmx1Y3k5bWIyNWpkR2x2Ym01aGJHbDBaWE12Wm05eWJYTXZhbUYyWVhOamNtbHdkQzlxZEdsd0xtcHpJaUIwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBqd3ZjMk55YVhCMFBnPT0nID48L2Rpdj4KCgoKPGRpdiBjbGFzcz0iYmFzZTY0amF2YXNjcmlwdDYxNjYyMzIzMDQ2NDQzNDk4YmRmMDE5LjMxMDkxNjM1IiB0aXRsZT0nUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBqd2hMUzBLSkNnbmFXNXdkWFF1Wm05eWJXOG5LUzVpYVc1a0tDZG1iMk4xY3ljc1puVnVZM1JwYjI0b0tYc2tLSFJvYVhNcExuSmxiVzkyWlVOc1lYTnpLQ2RtYjNKdGJ5Y3BMbUZrWkVOc1lYTnpLQ2RtYjNKdGJ5MW1iMk4xY3ljcE8zMHBPd29rS0NkcGJuQjFkQzVtYjNKdGJ5Y3BMbUpwYm1Rb0oySnNkWEluTEdaMWJtTjBhVzl1S0NsN0pDaDBhR2x6S1M1eVpXMXZkbVZEYkdGemN5Z25abTl5Ylc4dFptOWpkWE1uS1M1aFpHUkRiR0Z6Y3lnblptOXliVzhuS1R0OUtUc0tKQ2duYVc1d2RYUXVabTl5Yld3bktTNWlhVzVrS0NkbWIyTjFjeWNzWm5WdVkzUnBiMjRvS1hza0tIUm9hWE1wTG5KbGJXOTJaVU5zWVhOektDZG1iM0p0YkNjcExtRmtaRU5zWVhOektDZG1iM0p0YkMxbWIyTjFjeWNwTzMwcE93b2tLQ2RwYm5CMWRDNW1iM0p0YkNjcExtSnBibVFvSjJKc2RYSW5MR1oxYm1OMGFXOXVLQ2w3SkNoMGFHbHpLUzV5WlcxdmRtVkRiR0Z6Y3lnblptOXliV3d0Wm05amRYTW5LUzVoWkdSRGJHRnpjeWduWm05eWJXd25LVHQ5S1RzS0NpOHZMUzArUEM5elkzSnBjSFErJyA+PC9kaXY+CgoKCgkKCQoJCgoKPC9kaXY+',
216
+                'balise' => '<div class="base64" title="bW9kZWxlIDogYTo3OntzOjQ6JnF1b3Q7bGFuZyZxdW90OztzOjI6JnF1b3Q7ZnImcXVvdDs7czo0OiZxdW90O2ZvbmQmcXVvdDs7czoxMjomcXVvdDttb2RlbGVzL2Zvcm0mcXVvdDs7czoxMDomcXVvdDtkaXJfcmFjaW5lJnF1b3Q7O3M6MzomcXVvdDsuLi8mcXVvdDs7czoyOiZxdW90O2lkJnF1b3Q7O3M6MTomcXVvdDsxJnF1b3Q7O3M6NzomcXVvdDtpZF9mb3JtJnF1b3Q7O3M6MTomcXVvdDsxJnF1b3Q7O3M6NDomcXVvdDtkYXRlJnF1b3Q7O3M6MTk6JnF1b3Q7MjAwNy0wNS0xMSAxMTo0MjoxOSZxdW90OztzOjEwOiZxdW90O2RhdGVfcmVkYWMmcXVvdDs7czoxOTomcXVvdDsyMDA3LTA1LTExIDExOjQyOjE5JnF1b3Q7O30KCmljaXRvdG8KCjxhIG5hbWU9J2Zvcm0xJz48L2E+CjxkaXYgY2xhc3M9J3NwaXBfZm9ybXMnPgoKPGRpdiBjbGFzcz0nc3BpcF9kZXNjcmlwdGlmJz48L2Rpdj4KCgoKCiAKCQkKCQk8ZGl2PgoJCQo8aW5wdXQgbmFtZT0nZXhlYycgdmFsdWU9J2FydGljbGVzJyB0eXBlPSdoaWRkZW4nIC8+CjxpbnB1dCBuYW1lPSdpZF9hcnRpY2xlJyB2YWx1ZT0nOCcgdHlwZT0naGlkZGVuJyAvPgoJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2Fqb3V0X3JlcG9uc2UnIHZhbHVlPScxJyAvPgoJCTxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2lkX2Rvbm5lZScgdmFsdWU9Jy0xMCcgLz4KCQkKCQk8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdyZXRvdXJfZm9ybScgdmFsdWU9JycgLz4KCQkKCQk8L2Rpdj4KCQkJCgoKIAoJIAoJCQoJCSA8ZmllbGRzZXQ+PGxlZ2VuZD5Ob3VzIGNvbnRhY3RlcjwvbGVnZW5kPiAKCQoJIAoJCTxkaXYgY2xhc3M9J3NwaXBfZm9ybV9jaGFtcCBsaWduZV8xJz4KCQkJCgkJCSAKCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWwnPgoJCQkJCSA8bGFiZWwgZm9yPSJpbnB1dC0xLWxpZ25lXzEiPlZvdHJlIE5vbTwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCSAKCQkJCQoJCQkJPGlucHV0IHR5cGU9InRleHRlIiBuYW1lPSdsaWduZV8xJyBpZD0naW5wdXQtMS1saWduZV8xJyB2YWx1ZT0iIiAKCQkJCQkJY2xhc3M9JyAgbGlnbmUgZm9ybWwnIAoJCQkJCQlzaXplPSc0MCcgLz4KCQkJCQoJCQkJCgkJCQkKCQkJCTxzcGFuIGNsYXNzPSduZXR0b3lldXInPiA8L3NwYW4+CgkJCQoJCTwvZGl2PgoJCgoKCiAKCSAKCQkKCQkKCQoJIAoJCTxkaXYgY2xhc3M9J3NwaXBfZm9ybV9jaGFtcCBsaWduZV8yJz4KCQkJCgkJCSAKCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWwnPgoJCQkJCSA8bGFiZWwgZm9yPSJpbnB1dC0xLWxpZ25lXzIiPlZvdHJlIFByw6lub208L2xhYmVsPgoJCQkJCQoJCQkJCTxzcGFuIGNsYXNzPSdzcGlwX2Zvcm1fbGFiZWxfb2JsaWdhdG9pcmUnPgoJCQkJCQlbT2JsaWdhdG9pcmVdPC9zcGFuPgoJCQkJCToKCQkJCTwvc3Bhbj4KCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgCgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0ZSIgbmFtZT0nbGlnbmVfMicgaWQ9J2lucHV0LTEtbGlnbmVfMicgdmFsdWU9IiIgCgkJCQkJCWNsYXNzPScgIGxpZ25lIGZvcm1sJyAKCQkJCQkJc2l6ZT0nNDAnIC8+CgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgZW1haWxfMSc+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS1lbWFpbF8xIj5Wb3RyZSBlbWFpbDwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsX2RldGFpbHMnPlZldWlsbGV6IGVudHJlciB1bmUgYWRyZXNzZSBlLW1haWwgdmFsaWRlIChkZSB0eXBlIHZvdXNAZm91cm5pc3NldXIuY29tKS48L3NwYW4+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgCgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0ZSIgbmFtZT0nZW1haWxfMScgaWQ9J2lucHV0LTEtZW1haWxfMScgdmFsdWU9IiIgCgkJCQkJCWNsYXNzPScgIGVtYWlsIGZvcm1sJyAKCQkJCQkJc2l6ZT0nNDAnIC8+CgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgdGV4dGVfMSc+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS10ZXh0ZV8xIj5Wb3RyZSBBZHJlc3NlPC9sYWJlbD4KCQkJCQkKCQkJCQkKCQkJCQk6CgkJCQk8L3NwYW4+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCSAgPGRpdiBjbGFzcz0iYmFzZTY0amF2YXNjcmlwdDYxNjYyMzIzMDQ2NDQzNDk4YmRmMDE5LjMxMDkxNjM1IiB0aXRsZT0nUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaUlITnlZejBpTGk0dmNHeDFaMmx1Y3k5aFpHMXBiaTh0YWxGMVpYSjVMMmx0WjE5d1lXTnJMMnhoZVdWeUxtcHpJajQ4TDNOamNtbHdkRDQ9JyA+PC9kaXY+Cgo8ZGl2IGNsYXNzPSJiYXNlNjRqYXZhc2NyaXB0NjE2NjIzMjMwNDY0NDM0OThiZGYwMTkuMzEwOTE2MzUiIHRpdGxlPSdQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpSUhOeVl6MGlMaTR2Y0d4MVoybHVjeTltYjI1amRHbHZibTVoYkdsMFpYTXZZbUZ5Y21WZmRIbHdiMTlsWTI5c2IyZHBjWFZsTDJwekwzTndhWEJmWW1GeWNtVXVhbk1pUGp3dmMyTnlhWEIwUGc9PScgPjwvZGl2PgoKPHRhYmxlIGNsYXNzPSdzcGlwX2JhcnJlJyBzdHlsZT0nd2lkdGg6YXV0bzsnIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCcgYm9yZGVyPScwJyBzdW1tYXJ5PScnPgo8dHIgc3R5bGU9J3dpZHRoOiBhdXRvOycgY2xhc3M9J3NwaXBfYmFycmUnPgo8dGQgc3R5bGU9J3RleHQtYWxpZ246IGxlZnQ7JyB2YWxpZ249J21pZGRsZSc+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ3snLCd9Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGVuIHtpdGFsaXF1ZX0iPjxpbWcgc3JjPSdpbWdfcGFjay9pY29uZXNfYmFycmUvaXRhbGlxdWUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGVuIHtpdGFsaXF1ZX0iIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCd7eycsJ319Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGVuIHt7Z3Jhc319Ij48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2dyYXMucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGVuIHt7Z3Jhc319IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnWyonLCcqXScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBsZSB0ZXh0ZSBlbiBbKiZlYWN1dGU7dmlkZW5jZSpdIj48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9taXNlZW5ldmlkZW5jZS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJNZXR0cmUgbGUgdGV4dGUgZW4gWyomZWFjdXRlO3ZpZGVuY2UqXSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJyUzQ3N1cCUzRScsJyUzQy9zdXAlM0UnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJNZXR0cmUgbGUgdGV4dGUgZW4gJmx0O3N1cCZndDtleHBvc2FudCZsdDsvc3VwJmd0OyI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZXhwb3NhbnQucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGxlIHRleHRlIGVuICZsdDtzdXAmZ3Q7ZXhwb3NhbnQmbHQ7L3N1cCZndDsiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCclM0NzYyUzRScsJyUzQy9zYyUzRScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBsZSB0ZXh0ZSBlbiAmbHQ7c2MmZ3Q7cGV0aXRlcyBjYXBpdGFsZXMmbHQ7L3NjJmd0OyI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvcGV0aXRlc2NhcGl0YWxlcy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJNZXR0cmUgbGUgdGV4dGUgZW4gJmx0O3NjJmd0O3BldGl0ZXMgY2FwaXRhbGVzJmx0Oy9zYyZndDsiIC8+PC9hPiZuYnNwOzwvdGQ+Cjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCcxMScsJycpOyIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IlRyYW5zZm9ybWVyIGVuIFtsaWVuIGh5cGVydGV4dGUtPmh0dHA6Ly8uLi5dIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2xpZW4ucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iVHJhbnNmb3JtZXIgZW4gW2xpZW4gaHlwZXJ0ZXh0ZS0+aHR0cDovLy4uLl0iIC8+PC9hPiZuYnNwOzwvdGQ+Cjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnJTVDbiU1Q24lM0NxdW90ZSUzRScsJyUzQy9xdW90ZSUzRSU1Q24lNUNuJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iQ2l0ZXIgdW4gbWVzc2FnZSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9xdW90ZS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJDaXRlciB1biBtZXNzYWdlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnWz8nLCddJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iRW50ciZlYWN1dGU7ZSBkdSBbP2dsb3NzYWlyZV0gKFdpa2lwZWRpYSkiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2JhcnJlLXdpa2kucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iRW50ciZlYWN1dGU7ZSBkdSBbP2dsb3NzYWlyZV0gKFdpa2lwZWRpYSkiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6c3dhcF9jb3VjaGUoJzEwJywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gdGFibGVhdSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvYmFycmUtdGFibGVhdS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biB0YWJsZWF1IiAvPjwvYT4mbmJzcDwvdGQ+Cjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCcxNCcsJycpOyIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkNoZXJjaGVyIFJlbXBsYWNlciI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvY2hlcmNoZXJfcmVtcGxhY2VyLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkNoZXJjaGVyIFJlbXBsYWNlciIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnMTInLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJHZXN0aW9uIGRlcyBhbmNyZXMiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FuY3JlLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ikdlc3Rpb24gZGVzIGFuY3JlcyIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOmxlZnQ7JyB2YWxpZ249J21pZGRsZSc+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnMTMnLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJDYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXgiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2NsYXZpZXIucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iQ2FyYWN0JmVncmF2ZTtyZXMgc3AmZWFjdXRlO2NpYXV4IiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQgc3R5bGU9J3RleHQtYWxpZ246cmlnaHQ7JyB2YWxpZ249J21pZGRsZSc+Jm5ic3A7Jm5ic3A7PGEgY2xhc3M9J2FpZGUnIGhyZWY9J2h0dHA6Ly9wcmVwcm9kLm5vdHJlLXZpbGxlLm5ldC9+c3RzZWIvZWNyaXJlLz9leGVjPWFpZGVfaW5kZXgmYW1wO2FpZGU9cmFjY291cmNpcyZhbXA7dmFyX2xhbmc9ZnInIHRhcmdldD0ic3BpcF9haWRlIiBvbmNsaWNrPSJqYXZhc2NyaXB0OndpbmRvdy5vcGVuKHRoaXMuaHJlZiwnc3BpcF9haWRlJywgJ3Njcm9sbGJhcnM9eWVzLCByZXNpemFibGU9eWVzLCB3aWR0aD03NDAsIGhlaWdodD01ODAnKTsgcmV0dXJuIGZhbHNlOyI+PGltZyBzcmM9J2ltZ19wYWNrL2FpZGUuZ2lmJwphbHQ9IkFJREUiIHRpdGxlPSJEZSBsJ2FpZGUgc3VyIGNldCAmZWFjdXRlO2wmZWFjdXRlO21lbnQiIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgYWxpZ249Im1pZGRsZSIgLz48L2E+Jm5ic3A7PC90ZD48L3RyPjwvdGFibGU+PGRpdiBpZD0nTGF5ZXIxMCcgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID48dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCjx0cj48dGQ+DQpOYiBjb2xvbm5lczogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX25iY29sb25lcyIgc3R5bGU9IndpZHRoOiAzMHB4OyIgdmFsdWU9IjIiIHNpemU9IjIiIG1heGxlbmd0aD0iMiIgICAvPjwvdGQ+PHRkPg0KTmIgbGlnbmVzOiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYmFycmVfbmJyYW5ncyIgc3R5bGU9IndpZHRoOiAzMHB4OyIgdmFsdWU9IjIiIHNpemU9IjIiIG1heGxlbmd0aD0iMiIgLz48L3RkPjx0ZD4NCjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iYmFycmVfZG9lbnRldGUiIHZhbHVlPSItMSIgY2hlY2tlZD0iY2hlY2tlZCIgLz4gRW50ZXRlPC90ZD48dGQ+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImJhcnJlX2RvY2FwdGlvbiIgdmFsdWU9Ii0xIiBjaGVja2VkPSJjaGVja2VkIiAvPiBDYXB0aW9uIGV0IFImZWFjdXRlO3N1bSZlYWN1dGU7PC90ZD48dGQ+DQogIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIiBvbmNsaWNrPSJqYXZhc2NyaXB0Og0KICAgIGJhcnJlX25iY29sb25lcy52YWx1ZSA9IE1hdGguYWJzKGJhcnJlX25iY29sb25lcy52YWx1ZSk7IGJhcnJlX25icmFuZ3MudmFsdWUNCiAgICA9IE1hdGguYWJzKGJhcnJlX25icmFuZ3MudmFsdWUpOw0KICAgIGlmICghKGJhcnJlX25iY29sb25lcy52YWx1ZSA9PSAwIHx8IGJhcnJlX25icmFuZ3MudmFsdWUgPT0gMCkpIHsNCiAgICBiYXJyZV90YWJsZWF1KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSwgYmFycmVfbmJjb2xvbmVzLnZhbHVlLCBiYXJyZV9uYnJhbmdzLnZhbHVlLA0KICAgIGJhcnJlX2RvZW50ZXRlLmNoZWNrZWQsIGJhcnJlX2RvY2FwdGlvbi5jaGVja2VkKTsgfSAiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+DQo8ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyMTEnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQogPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkPiANCkFkcmVzc2UmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX25vbSIgdmFsdWU9Imh0dHA6Ly8iIHNpemU9IjIxIiBtYXhsZW5ndGg9IjI1NSIgLz48YnIgLz4NCkJ1bGxlIGQnYWlkZSZuYnNwOzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxpZW5fYnVsbGUiIHZhbHVlPSIiIHNpemU9IjIxIiBtYXhsZW5ndGg9IjI1NSIgLz4NCjwvdGQ+PHRkPg0KTGFuZ3VlIGFiciZlYWN1dGU7ZyZlYWN1dGU7ZSZuYnNwOzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImxpZW5fbGFuZ3VlIiB2YWx1ZT0iIiBzaXplPSIxMCIgbWF4bGVuZ3RoPSIxMCIgLz4NCjwvdGQ+PHRkPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9kZW1hbmRlX2xpZW4oJ1snLCAnLT4nLCAnXScsIGxpZW5fbm9tLnZhbHVlLCBsaWVuX2J1bGxlLnZhbHVlLCBsaWVuX2xhbmd1ZS52YWx1ZSxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpOyIgLz4gDQo8L3RkPjwvdHI+PC90YWJsZT4NCjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+PGRpdiBpZD0nTGF5ZXIxMicgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnID4NCjx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KICA8dHI+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyB0ZXh0LWFsaWduOmNlbnRlcjsiPjxzdHJvbmc+R2VzdGlvbiBkZXMgYW5jcmVzPC9zdHJvbmc+PC90ZD4NCiAgICA8dGQgc3R5bGU9IndpZHRoOmF1dG87Ij48c3Ryb25nPlRyYW5zZm9ybWVyIGVuIGFuY3JlPC9zdHJvbmc+PGJyIC8+DQogICAgPGxhYmVsIGZvcj0iYW5jcmVfbm9tIj48aT5Ob20gZGUgbCdhbmNyZTwvaT48L2xhYmVsPiA8YnIgLz4NCiAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9ub20iIGlkPSJhbmNyZV9ub20iIC8+DQoJICANCgk8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9hbmNyZSgnWycsICc8LScsICddJywgYW5jcmVfbm9tLnZhbHVlLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpOyIgLz4NCiAgICA8L3RkPg0KCTx0ZCBzdHlsZT0id2lkdGg6YXV0bzsiPjxzdHJvbmc+UG9pbnRlciB2ZXJzIHVuZSBhbmNyZTwvc3Ryb25nPjxiciAvPg0KICAgIDxsYWJlbCBmb3I9ImFuY3JlX2NpYmxlIj48aT5BbmNyZSBjaWJsZTwvaT48L2xhYmVsPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYW5jcmVfY2libGUiIGlkPSJhbmNyZV9jaWJsZSIgLz48YnIgLz4NCgk8bGFiZWwgZm9yPSJhbmNyZV9idWxsZSI+PGk+QnVsbGUgZCdhaWRlIGFuY3JlPC9pPjwvbGFiZWw+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbmNyZV9idWxsZSIgaWQ9ImFuY3JlX2J1bGxlIiAvPg0KCTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJPSyIgY2xhc3M9ImZvbmRvIiBvbmNsaWNrPSJqYXZhc2NyaXB0OmJhcnJlX2RlbWFuZGUoJ1snLCAnLT4jJywgJ10nLCBhbmNyZV9jaWJsZS52YWx1ZSwgYW5jcmVfYnVsbGUudmFsdWUsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSk7IiAvPiANCjwvdGQ+DQogIDwvdHI+IA0KPC90YWJsZT48ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyMTMnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQo8dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCiAgPHRyIGNsYXNzPSJzcGlwX2JhcnJlIj4NCiAgICA8dGQgc3R5bGU9IndpZHRoOjMwJTsiPkNhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eDwvdGQ+DQogICAgPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCdcdTAwYWJ+Jywnflx1MDBiYicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkVudG91cmVyIGRlICZsYXF1bzsgZ3VpbGxlbWV0cyAmcmFxdW87Ij48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2d1aWxsZW1ldHMucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iRW50b3VyZXIgZGUgJmxhcXVvOyBndWlsbGVtZXRzICZyYXF1bzsiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCdcdTAwOTMnLCdcdTAwOTQnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJFbnRvdXJlciBkZSAmbGRxdW87Z3VpbGxlbWV0cyBkZSBzZWNvbmQgbml2ZWF1JnJkcXVvOyI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9ndWlsbGVtZXRzLXNpbXBsZXMucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iRW50b3VyZXIgZGUgJmxkcXVvO2d1aWxsZW1ldHMgZGUgc2Vjb25kIG5pdmVhdSZyZHF1bzsiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGMwJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gQSBhY2NlbnQgZ3JhdmUgbWFqdXNjdWxlIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2FncmF2ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gQSBhY2NlbnQgZ3JhdmUgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjOScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgYWNjZW50IGFpZ3UgbWFqdXNjdWxlIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2VhY3V0ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBhY2NlbnQgYWlndSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM4Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBtYWp1c2N1bGUgYWNjZW50IGdyYXZlIj48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9lYWdyYXZlLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIG1hanVzY3VsZSBhY2NlbnQgZ3JhdmUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGU2Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8xJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvYWVsaWcucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzYnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIG1hanVzY3VsZSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvYWVsaWctbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJyZvZWxpZzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL29lbGlnLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ08iIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignJk9FbGlnOycsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ08gbWFqdXNjdWxlIj48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL29lbGlnLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzcnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBDIGMmZWFjdXRlO2RpbGxlIG1hanVzY3VsZSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvY2NlZGlsLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBDIGMmZWFjdXRlO2RpbGxlIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCcmZXVybzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzEnKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciBsZSBzeW1ib2xlICZldXJvOyI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9ldXJvLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIGxlIHN5bWJvbGUgJmV1cm87IiAvPjwvYT4mbmJzcDsNCiAgICA8L3RkPg0KICA8L3RyPiANCjwvdGFibGU+DQo8ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyMTQnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQo8dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCjx0cj48dGQgc3R5bGU9IndpZHRoOiAyNSU7Ij5DaGVyY2hlcjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9jaGVyY2hlciIgdmFsdWU9IiIgc2l6ZT0iMTIiIG1heGxlbmd0aD0iMjU1IiAvPjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMjAlOyI+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY19jYXNlIiB2YWx1ZT0ieWVzIiAvPlJlc3BlY3RlciBsYSBjYXNzZTxiciAvPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjX2VudGllciIgdmFsdWU9InllcyIgLz4NCk1vdCBlbnRpZXINCjwvdGQ+PHRkICBzdHlsZT0id2lkdGg6IDI1JTsiPlJlbXBsYWNlcjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9yZW1wbGFjZXIiIHZhbHVlPSIiIHNpemU9IjEyIiBtYXhsZW5ndGg9IjI1NSIgLz4gDQo8L3RkPjx0ZCBzdHlsZT0id2lkdGg6IDIwJTsiPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZWNfdG91dCIgdmFsdWU9InllcyIgLz5Ub3V0IHJlbXBsYWNlcjwvdGQ+PHRkIHN0eWxlPSJ3aWR0aDogMTAlOyI+DQogICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyINCiAgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9zZWFyY2hyZXBsYWNlKGRvY3VtZW50LmZvcm11bGFpcmUuYmFycmVfY2hlcmNoZXIudmFsdWUsIGRvY3VtZW50LmZvcm11bGFpcmUuYmFycmVfcmVtcGxhY2VyLnZhbHVlLCBkb2N1bWVudC5mb3JtdWxhaXJlLnJlY190b3V0LmNoZWNrZWQsIGRvY3VtZW50LmZvcm11bGFpcmUucmVjX2Nhc2UuY2hlY2tlZCwgZG9jdW1lbnQuZm9ybXVsYWlyZS5yZWNfZW50aWVyLmNoZWNrZWQsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMScpKTsiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+PGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj4KCTx0ZXh0YXJlYSBuYW1lPSd0ZXh0ZV8xJyByb3dzPScxMCcgY2xhc3M9J2Zvcm1vICAgJyBjb2xzPSc4MCcKCWlkPSdpbnB1dC0xLXRleHRlXzEnCglvbnNlbGVjdD0nc3RvcmVDYXJldCh0aGlzKTsnCglvbmNsaWNrPSdzdG9yZUNhcmV0KHRoaXMpOycKCW9ua2V5dXA9J3N0b3JlQ2FyZXQodGhpcyk7JwoJb25kYmxjbGljaz0nc3RvcmVDYXJldCh0aGlzKTsnPjwvdGV4dGFyZWE+CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQk8c3BhbiBjbGFzcz0nbmV0dG95ZXVyJz4gPC9zcGFuPgoJCQkKCQk8L2Rpdj4KCQoKCgogCgkgCgkJCgkJCgkKCSAKCQk8ZGl2IGNsYXNzPSdzcGlwX2Zvcm1fY2hhbXAgdGV4dGVfMic+CgkJCQoJCQkgCgkJCQk8c3BhbiBjbGFzcz0nc3BpcF9mb3JtX2xhYmVsJz4KCQkJCQkgPGxhYmVsIGZvcj0iaW5wdXQtMS10ZXh0ZV8yIj5Wb3RyZSBRdWVzdGlvbjwvbGFiZWw+CgkJCQkJCgkJCQkJPHNwYW4gY2xhc3M9J3NwaXBfZm9ybV9sYWJlbF9vYmxpZ2F0b2lyZSc+CgkJCQkJCVtPYmxpZ2F0b2lyZV08L3NwYW4+CgkJCQkJOgoJCQkJPC9zcGFuPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkgIDx0YWJsZSBjbGFzcz0nc3BpcF9iYXJyZScgc3R5bGU9J3dpZHRoOmF1dG87JyBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnIGJvcmRlcj0nMCcgc3VtbWFyeT0nJz4KPHRyIHN0eWxlPSd3aWR0aDogYXV0bzsnIGNsYXNzPSdzcGlwX2JhcnJlJz4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOiBsZWZ0OycgdmFsaWduPSdtaWRkbGUnPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCd7JywnfScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBlbiB7aXRhbGlxdWV9Ij48aW1nIHNyYz0naW1nX3BhY2svaWNvbmVzX2JhcnJlL2l0YWxpcXVlLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBlbiB7aXRhbGlxdWV9IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgne3snLCd9fScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9Ik1ldHRyZSBlbiB7e2dyYXN9fSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9ncmFzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBlbiB7e2dyYXN9fSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ1sqJywnKl0nLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJNZXR0cmUgbGUgdGV4dGUgZW4gWyomZWFjdXRlO3ZpZGVuY2UqXSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvbWlzZWVuZXZpZGVuY2UucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGxlIHRleHRlIGVuIFsqJmVhY3V0ZTt2aWRlbmNlKl0iIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfcmFjY291cmNpKCclM0NzdXAlM0UnLCclM0Mvc3VwJTNFJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iTWV0dHJlIGxlIHRleHRlIGVuICZsdDtzdXAmZ3Q7ZXhwb3NhbnQmbHQ7L3N1cCZndDsiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2V4cG9zYW50LnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9Ik1ldHRyZSBsZSB0ZXh0ZSBlbiAmbHQ7c3VwJmd0O2V4cG9zYW50Jmx0Oy9zdXAmZ3Q7IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnJTNDc2MlM0UnLCclM0Mvc2MlM0UnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJNZXR0cmUgbGUgdGV4dGUgZW4gJmx0O3NjJmd0O3BldGl0ZXMgY2FwaXRhbGVzJmx0Oy9zYyZndDsiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL3BldGl0ZXNjYXBpdGFsZXMucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iTWV0dHJlIGxlIHRleHRlIGVuICZsdDtzYyZndDtwZXRpdGVzIGNhcGl0YWxlcyZsdDsvc2MmZ3Q7IiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnMTYnLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJUcmFuc2Zvcm1lciBlbiBbbGllbiBoeXBlcnRleHRlLT5odHRwOi8vLi4uXSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9saWVuLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IlRyYW5zZm9ybWVyIGVuIFtsaWVuIGh5cGVydGV4dGUtPmh0dHA6Ly8uLi5dIiAvPjwvYT4mbmJzcDs8L3RkPgo8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJyU1Q24lNUNuJTNDcXVvdGUlM0UnLCclM0MvcXVvdGUlM0UlNUNuJTVDbicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkNpdGVyIHVuIG1lc3NhZ2UiPjxpbWcgc3JjPSdpbWdfcGFjay9pY29uZXNfYmFycmUvcXVvdGUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iQ2l0ZXIgdW4gbWVzc2FnZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9yYWNjb3VyY2koJ1s/JywnXScsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IkVudHImZWFjdXRlO2UgZHUgWz9nbG9zc2FpcmVdIChXaWtpcGVkaWEpIj48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9iYXJyZS13aWtpLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudHImZWFjdXRlO2UgZHUgWz9nbG9zc2FpcmVdIChXaWtpcGVkaWEpIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OnN3YXBfY291Y2hlKCcxNScsJycpOyIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIHRhYmxlYXUiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2JhcnJlLXRhYmxlYXUucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gdGFibGVhdSIgLz48L2E+Jm5ic3A8L3RkPgo8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpzd2FwX2NvdWNoZSgnMTknLCcnKTsiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJDaGVyY2hlciBSZW1wbGFjZXIiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2NoZXJjaGVyX3JlbXBsYWNlci5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJDaGVyY2hlciBSZW1wbGFjZXIiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6c3dhcF9jb3VjaGUoJzE3JywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iR2VzdGlvbiBkZXMgYW5jcmVzIj48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9hbmNyZS5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJHZXN0aW9uIGRlcyBhbmNyZXMiIC8+PC9hPiZuYnNwOzwvdGQ+Cjx0ZCBzdHlsZT0ndGV4dC1hbGlnbjpsZWZ0OycgdmFsaWduPSdtaWRkbGUnPjxhIGhyZWY9ImphdmFzY3JpcHQ6c3dhcF9jb3VjaGUoJzE4JywnJyk7IgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iQ2FyYWN0JmVncmF2ZTtyZXMgc3AmZWFjdXRlO2NpYXV4Ij48aW1nIHNyYz0nLi4vcGx1Z2lucy9mb25jdGlvbm5hbGl0ZXMvYmFycmVfdHlwb19lY29sb2dpcXVlL2ltZ19wYWNrL2ljb25lc19iYXJyZS9jbGF2aWVyLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkNhcmFjdCZlZ3JhdmU7cmVzIHNwJmVhY3V0ZTtjaWF1eCIgLz48L2E+Jm5ic3A7PC90ZD4KPHRkIHN0eWxlPSd0ZXh0LWFsaWduOnJpZ2h0OycgdmFsaWduPSdtaWRkbGUnPiZuYnNwOyZuYnNwOzxhIGNsYXNzPSdhaWRlJyBocmVmPSdodHRwOi8vcHJlcHJvZC5ub3RyZS12aWxsZS5uZXQvfnN0c2ViL2VjcmlyZS8/ZXhlYz1haWRlX2luZGV4JmFtcDthaWRlPXJhY2NvdXJjaXMmYW1wO3Zhcl9sYW5nPWZyJyB0YXJnZXQ9InNwaXBfYWlkZSIgb25jbGljaz0iamF2YXNjcmlwdDp3aW5kb3cub3Blbih0aGlzLmhyZWYsJ3NwaXBfYWlkZScsICdzY3JvbGxiYXJzPXllcywgcmVzaXphYmxlPXllcywgd2lkdGg9NzQwLCBoZWlnaHQ9NTgwJyk7IHJldHVybiBmYWxzZTsiPjxpbWcgc3JjPSdpbWdfcGFjay9haWRlLmdpZicKYWx0PSJBSURFIiB0aXRsZT0iRGUgbCdhaWRlIHN1ciBjZXQgJmVhY3V0ZTtsJmVhY3V0ZTttZW50IiB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIGFsaWduPSJtaWRkbGUiIC8+PC9hPiZuYnNwOzwvdGQ+PC90cj48L3RhYmxlPjxkaXYgaWQ9J0xheWVyMTUnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+PHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkPg0KTmIgY29sb25uZXM6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJiYXJyZV9uYmNvbG9uZXMiIHN0eWxlPSJ3aWR0aDogMzBweDsiIHZhbHVlPSIyIiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiICAgLz48L3RkPjx0ZD4NCk5iIGxpZ25lczogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJhcnJlX25icmFuZ3MiIHN0eWxlPSJ3aWR0aDogMzBweDsiIHZhbHVlPSIyIiBzaXplPSIyIiBtYXhsZW5ndGg9IjIiIC8+PC90ZD48dGQ+DQo8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImJhcnJlX2RvZW50ZXRlIiB2YWx1ZT0iLTEiIGNoZWNrZWQ9ImNoZWNrZWQiIC8+IEVudGV0ZTwvdGQ+PHRkPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJiYXJyZV9kb2NhcHRpb24iIHZhbHVlPSItMSIgY2hlY2tlZD0iY2hlY2tlZCIgLz4gQ2FwdGlvbiBldCBSJmVhY3V0ZTtzdW0mZWFjdXRlOzwvdGQ+PHRkPg0KICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDoNCiAgICBiYXJyZV9uYmNvbG9uZXMudmFsdWUgPSBNYXRoLmFicyhiYXJyZV9uYmNvbG9uZXMudmFsdWUpOyBiYXJyZV9uYnJhbmdzLnZhbHVlDQogICAgPSBNYXRoLmFicyhiYXJyZV9uYnJhbmdzLnZhbHVlKTsNCiAgICBpZiAoIShiYXJyZV9uYmNvbG9uZXMudmFsdWUgPT0gMCB8fCBiYXJyZV9uYnJhbmdzLnZhbHVlID09IDApKSB7DQogICAgYmFycmVfdGFibGVhdShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJyksIGJhcnJlX25iY29sb25lcy52YWx1ZSwgYmFycmVfbmJyYW5ncy52YWx1ZSwNCiAgICBiYXJyZV9kb2VudGV0ZS5jaGVja2VkLCBiYXJyZV9kb2NhcHRpb24uY2hlY2tlZCk7IH0gIiAvPiANCjwvdGQ+PC90cj48L3RhYmxlPg0KPGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjE2JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KIDx0YWJsZSBjbGFzcz0ic3BpcF9iYXJyZSIgc3R5bGU9IndpZHRoOiBhdXRvOyBwYWRkaW5nOiAxcHghaW1wb3J0YW50OyBib3JkZXItdG9wOiAwcHg7IiBzdW1tYXJ5PSIiPg0KPHRyPjx0ZD4gDQpBZHJlc3NlJm5ic3A7OiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibGllbl9ub20iIHZhbHVlPSJodHRwOi8vIiBzaXplPSIyMSIgbWF4bGVuZ3RoPSIyNTUiIC8+PGJyIC8+DQpCdWxsZSBkJ2FpZGUmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX2J1bGxlIiB2YWx1ZT0iIiBzaXplPSIyMSIgbWF4bGVuZ3RoPSIyNTUiIC8+DQo8L3RkPjx0ZD4NCkxhbmd1ZSBhYnImZWFjdXRlO2cmZWFjdXRlO2UmbmJzcDs6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWVuX2xhbmd1ZSIgdmFsdWU9IiIgc2l6ZT0iMTAiIG1heGxlbmd0aD0iMTAiIC8+DQo8L3RkPjx0ZD4NCiAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfZGVtYW5kZV9saWVuKCdbJywgJy0+JywgJ10nLCBsaWVuX25vbS52YWx1ZSwgbGllbl9idWxsZS52YWx1ZSwgbGllbl9sYW5ndWUudmFsdWUsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKTsiIC8+IA0KPC90ZD48L3RyPjwvdGFibGU+DQo8ZGl2IHN0eWxlPSdjbGVhcjogYm90aDsnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9J0xheWVyMTcnIHN0eWxlPSdkaXNwbGF5Om5vbmU7JyA+DQo8dGFibGUgY2xhc3M9InNwaXBfYmFycmUiIHN0eWxlPSJ3aWR0aDogYXV0bzsgcGFkZGluZzogMXB4IWltcG9ydGFudDsgYm9yZGVyLXRvcDogMHB4OyIgc3VtbWFyeT0iIj4NCiAgPHRyPg0KICAgIDx0ZCBzdHlsZT0id2lkdGg6YXV0bzsgdGV4dC1hbGlnbjpjZW50ZXI7Ij48c3Ryb25nPkdlc3Rpb24gZGVzIGFuY3Jlczwvc3Ryb25nPjwvdGQ+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyI+PHN0cm9uZz5UcmFuc2Zvcm1lciBlbiBhbmNyZTwvc3Ryb25nPjxiciAvPg0KICAgIDxsYWJlbCBmb3I9ImFuY3JlX25vbSI+PGk+Tm9tIGRlIGwnYW5jcmU8L2k+PC9sYWJlbD4gPGJyIC8+DQogICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYW5jcmVfbm9tIiBpZD0iYW5jcmVfbm9tIiAvPg0KCSAgDQoJPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfYW5jcmUoJ1snLCAnPC0nLCAnXScsIGFuY3JlX25vbS52YWx1ZSwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKTsiIC8+DQogICAgPC90ZD4NCgk8dGQgc3R5bGU9IndpZHRoOmF1dG87Ij48c3Ryb25nPlBvaW50ZXIgdmVycyB1bmUgYW5jcmU8L3N0cm9uZz48YnIgLz4NCiAgICA8bGFiZWwgZm9yPSJhbmNyZV9jaWJsZSI+PGk+QW5jcmUgY2libGU8L2k+PC9sYWJlbD4gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImFuY3JlX2NpYmxlIiBpZD0iYW5jcmVfY2libGUiIC8+PGJyIC8+DQoJPGxhYmVsIGZvcj0iYW5jcmVfYnVsbGUiPjxpPkJ1bGxlIGQnYWlkZSBhbmNyZTwvaT48L2xhYmVsPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYW5jcmVfYnVsbGUiIGlkPSJhbmNyZV9idWxsZSIgLz4NCgk8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iT0siIGNsYXNzPSJmb25kbyIgb25jbGljaz0iamF2YXNjcmlwdDpiYXJyZV9kZW1hbmRlKCdbJywgJy0+IycsICddJywgYW5jcmVfY2libGUudmFsdWUsIGFuY3JlX2J1bGxlLnZhbHVlLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpOyIgLz4gDQo8L3RkPg0KICA8L3RyPiANCjwvdGFibGU+PGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjE4JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQogIDx0ciBjbGFzcz0ic3BpcF9iYXJyZSI+DQogICAgPHRkIHN0eWxlPSJ3aWR0aDozMCU7Ij5DYXJhY3QmZWdyYXZlO3JlcyBzcCZlYWN1dGU7Y2lhdXg8L3RkPg0KICAgIDx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnXHUwMGFificsJ35cdTAwYmInLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJFbnRvdXJlciBkZSAmbGFxdW87IGd1aWxsZW1ldHMgJnJhcXVvOyI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9ndWlsbGVtZXRzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudG91cmVyIGRlICZsYXF1bzsgZ3VpbGxlbWV0cyAmcmFxdW87IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX3JhY2NvdXJjaSgnXHUwMDkzJywnXHUwMDk0Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iRW50b3VyZXIgZGUgJmxkcXVvO2d1aWxsZW1ldHMgZGUgc2Vjb25kIG5pdmVhdSZyZHF1bzsiPjxpbWcgc3JjPSdpbWdfcGFjay9pY29uZXNfYmFycmUvZ3VpbGxlbWV0cy1zaW1wbGVzLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IkVudG91cmVyIGRlICZsZHF1bztndWlsbGVtZXRzIGRlIHNlY29uZCBuaXZlYXUmcmRxdW87IiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjMCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEEgYWNjZW50IGdyYXZlIG1hanVzY3VsZSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9hZ3JhdmUtbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEEgYWNjZW50IGdyYXZlIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCdcdTAwYzknLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGFjY2VudCBhaWd1IG1hanVzY3VsZSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9lYWN1dGUtbWFqLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgYWNjZW50IGFpZ3UgbWFqdXNjdWxlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBjOCcsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgbWFqdXNjdWxlIGFjY2VudCBncmF2ZSI+PGltZyBzcmM9Jy4uL3BsdWdpbnMvZm9uY3Rpb25uYWxpdGVzL2JhcnJlX3R5cG9fZWNvbG9naXF1ZS9pbWdfcGFjay9pY29uZXNfYmFycmUvZWFncmF2ZS1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBtYWp1c2N1bGUgYWNjZW50IGdyYXZlIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJ1x1MDBlNicsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LTEtdGV4dGVfMicpKSIKIGNsYXNzPSdzcGlwX2JhcnJlJyB0YWJpbmRleD0nMTAwMCcgdGl0bGU9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FlbGlnLnBuZycgaGVpZ2h0PScxNicgd2lkdGg9JzE2JyBhbHQ9IklucyZlYWN1dGU7cmVyIHVuIEUgZGFucyBsJ0EiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM2Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnQSBtYWp1c2N1bGUiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2FlbGlnLW1hai5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdBIG1hanVzY3VsZSIgLz48L2E+PGEgaHJlZj0iamF2YXNjcmlwdDpiYXJyZV9pbnNlcmVyKCcmb2VsaWc7Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9vZWxpZy5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIiAvPjwvYT48YSBocmVmPSJqYXZhc2NyaXB0OmJhcnJlX2luc2VyZXIoJyZPRWxpZzsnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSkiCiBjbGFzcz0nc3BpcF9iYXJyZScgdGFiaW5kZXg9JzEwMDAnIHRpdGxlPSJJbnMmZWFjdXRlO3JlciB1biBFIGRhbnMgbCdPIG1hanVzY3VsZSI+PGltZyBzcmM9J2ltZ19wYWNrL2ljb25lc19iYXJyZS9vZWxpZy1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gRSBkYW5zIGwnTyBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignXHUwMGM3Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgdW4gQyBjJmVhY3V0ZTtkaWxsZSBtYWp1c2N1bGUiPjxpbWcgc3JjPScuLi9wbHVnaW5zL2ZvbmN0aW9ubmFsaXRlcy9iYXJyZV90eXBvX2Vjb2xvZ2lxdWUvaW1nX3BhY2svaWNvbmVzX2JhcnJlL2NjZWRpbC1tYWoucG5nJyBoZWlnaHQ9JzE2JyB3aWR0aD0nMTYnIGFsdD0iSW5zJmVhY3V0ZTtyZXIgdW4gQyBjJmVhY3V0ZTtkaWxsZSBtYWp1c2N1bGUiIC8+PC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6YmFycmVfaW5zZXJlcignJmV1cm87Jyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQtMS10ZXh0ZV8yJykpIgogY2xhc3M9J3NwaXBfYmFycmUnIHRhYmluZGV4PScxMDAwJyB0aXRsZT0iSW5zJmVhY3V0ZTtyZXIgbGUgc3ltYm9sZSAmZXVybzsiPjxpbWcgc3JjPSdpbWdfcGFjay9pY29uZXNfYmFycmUvZXVyby5wbmcnIGhlaWdodD0nMTYnIHdpZHRoPScxNicgYWx0PSJJbnMmZWFjdXRlO3JlciBsZSBzeW1ib2xlICZldXJvOyIgLz48L2E+Jm5ic3A7DQogICAgPC90ZD4NCiAgPC90cj4gDQo8L3RhYmxlPg0KPGRpdiBzdHlsZT0nY2xlYXI6IGJvdGg7Jz48L2Rpdj48L2Rpdj48ZGl2IGlkPSdMYXllcjE5JyBzdHlsZT0nZGlzcGxheTpub25lOycgPg0KPHRhYmxlIGNsYXNzPSJzcGlwX2JhcnJlIiBzdHlsZT0id2lkdGg6IGF1dG87IHBhZGRpbmc6IDFweCFpbXBvcnRhbnQ7IGJvcmRlci10b3A6IDBweDsiIHN1bW1hcnk9IiI+DQo8dHI+PHRkIHN0eWxlPSJ3aWR0aDogMjUlOyI+Q2hlcmNoZXI8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYmFycmVfY2hlcmNoZXIiIHZhbHVlPSIiIHNpemU9IjEyIiBtYXhsZW5ndGg9IjI1NSIgLz48L3RkPjx0ZCBzdHlsZT0id2lkdGg6IDIwJTsiPg0KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZWNfY2FzZSIgdmFsdWU9InllcyIgLz5SZXNwZWN0ZXIgbGEgY2Fzc2U8YnIgLz48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY19lbnRpZXIiIHZhbHVlPSJ5ZXMiIC8+DQpNb3QgZW50aWVyDQo8L3RkPjx0ZCAgc3R5bGU9IndpZHRoOiAyNSU7Ij5SZW1wbGFjZXI8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYmFycmVfcmVtcGxhY2VyIiB2YWx1ZT0iIiBzaXplPSIxMiIgbWF4bGVuZ3RoPSIyNTUiIC8+IA0KPC90ZD48dGQgc3R5bGU9IndpZHRoOiAyMCU7Ij4NCjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVjX3RvdXQiIHZhbHVlPSJ5ZXMiIC8+VG91dCByZW1wbGFjZXI8L3RkPjx0ZCBzdHlsZT0id2lkdGg6IDEwJTsiPg0KICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Ik9LIiBjbGFzcz0iZm9uZG8iDQogIG9uY2xpY2s9ImphdmFzY3JpcHQ6YmFycmVfc2VhcmNocmVwbGFjZShkb2N1bWVudC5mb3JtdWxhaXJlLmJhcnJlX2NoZXJjaGVyLnZhbHVlLCBkb2N1bWVudC5mb3JtdWxhaXJlLmJhcnJlX3JlbXBsYWNlci52YWx1ZSwgZG9jdW1lbnQuZm9ybXVsYWlyZS5yZWNfdG91dC5jaGVja2VkLCBkb2N1bWVudC5mb3JtdWxhaXJlLnJlY19jYXNlLmNoZWNrZWQsIGRvY3VtZW50LmZvcm11bGFpcmUucmVjX2VudGllci5jaGVja2VkLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC0xLXRleHRlXzInKSk7IiAvPiANCjwvdGQ+PC90cj48L3RhYmxlPjxkaXYgc3R5bGU9J2NsZWFyOiBib3RoOyc+PC9kaXY+PC9kaXY+Cgk8dGV4dGFyZWEgbmFtZT0ndGV4dGVfMicgcm93cz0nMTAnIGNsYXNzPSdmb3JtbCAgICcgY29scz0nODAnCglpZD0naW5wdXQtMS10ZXh0ZV8yJwoJb25zZWxlY3Q9J3N0b3JlQ2FyZXQodGhpcyk7JwoJb25jbGljaz0nc3RvcmVDYXJldCh0aGlzKTsnCglvbmtleXVwPSdzdG9yZUNhcmV0KHRoaXMpOycKCW9uZGJsY2xpY2s9J3N0b3JlQ2FyZXQodGhpcyk7Jz48L3RleHRhcmVhPgoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCQoJCQkJPHNwYW4gY2xhc3M9J25ldHRveWV1cic+IDwvc3Bhbj4KCQkJCgkJPC9kaXY+CgkKCgogCgk8L2ZpZWxkc2V0PgoKIAogCgkKCTxwIHN0eWxlPSdkaXNwbGF5Om5vbmU7Jz48bGFiZWwgZm9yPSJub2JvdG5vYm90LTEiPlZldWlsbGV6IGxhaXNzZXIgY2UgY2hhbXAgdmlkZSZuYnNwOzo8L2xhYmVsPgoJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im5vYm90bm9ib3QiIGlkPSJub2JvdG5vYm90LTEiIHZhbHVlPSIiIHNpemU9IjEwIiAvPjwvcD4KCQoJPGRpdiBzdHlsZT0ndGV4dC1hbGlnbjpyaWdodCcgY2xhc3M9J3NwaXBfYm91dG9uJz48aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSdWYWxpZGVyJyB2YWx1ZT0iVmFsaWRlciIgLz48L2Rpdj4KCgo8ZGl2IGNsYXNzPSJiYXNlNjRqYXZhc2NyaXB0NjE2NjIzMjMwNDY0NDM0OThiZGYwMTkuMzEwOTE2MzUiIHRpdGxlPSdQSE5qY21sd2RDQnpjbU05SW1oMGRIQTZMeTl3Y21Wd2NtOWtMbTV2ZEhKbExYWnBiR3hsTG01bGRDOStjM1J6WldJdmNHeDFaMmx1Y3k5bWIyNWpkR2x2Ym01aGJHbDBaWE12Wm05eWJYTXZhbUYyWVhOamNtbHdkQzlxZEdsd0xtcHpJaUIwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBqd3ZjMk55YVhCMFBnPT0nID48L2Rpdj4KCgoKPGRpdiBjbGFzcz0iYmFzZTY0amF2YXNjcmlwdDYxNjYyMzIzMDQ2NDQzNDk4YmRmMDE5LjMxMDkxNjM1IiB0aXRsZT0nUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBqd2hMUzBLSkNnbmFXNXdkWFF1Wm05eWJXOG5LUzVpYVc1a0tDZG1iMk4xY3ljc1puVnVZM1JwYjI0b0tYc2tLSFJvYVhNcExuSmxiVzkyWlVOc1lYTnpLQ2RtYjNKdGJ5Y3BMbUZrWkVOc1lYTnpLQ2RtYjNKdGJ5MW1iMk4xY3ljcE8zMHBPd29rS0NkcGJuQjFkQzVtYjNKdGJ5Y3BMbUpwYm1Rb0oySnNkWEluTEdaMWJtTjBhVzl1S0NsN0pDaDBhR2x6S1M1eVpXMXZkbVZEYkdGemN5Z25abTl5Ylc4dFptOWpkWE1uS1M1aFpHUkRiR0Z6Y3lnblptOXliVzhuS1R0OUtUc0tKQ2duYVc1d2RYUXVabTl5Yld3bktTNWlhVzVrS0NkbWIyTjFjeWNzWm5WdVkzUnBiMjRvS1hza0tIUm9hWE1wTG5KbGJXOTJaVU5zWVhOektDZG1iM0p0YkNjcExtRmtaRU5zWVhOektDZG1iM0p0YkMxbWIyTjFjeWNwTzMwcE93b2tLQ2RwYm5CMWRDNW1iM0p0YkNjcExtSnBibVFvSjJKc2RYSW5MR1oxYm1OMGFXOXVLQ2w3SkNoMGFHbHpLUzV5WlcxdmRtVkRiR0Z6Y3lnblptOXliV3d0Wm05amRYTW5LUzVoWkdSRGJHRnpjeWduWm05eWJXd25LVHQ5S1RzS0NpOHZMUzArUEM5elkzSnBjSFErJyA+PC9kaXY+CgoKCgkKCQoJCgoKPC9kaXY+" ></div>',
217
+                'attribut' => 'title',
218
+            ],
219 219
 
220
-		];
221
-	}
220
+        ];
221
+    }
222 222
 }
Please login to merge, or discard this patch.
ecrire/tests/Sql/SqlInMysqlTest.php 1 patch
Indentation   +169 added lines, -169 removed lines patch added patch discarded remove patch
@@ -9,186 +9,186 @@
 block discarded – undo
9 9
 
10 10
 class SqlInMysqlTest extends TestCase
11 11
 {
12
-	public static function setUpBeforeClass(): void {
13
-		find_in_path('base/abstract_sql.php', '', true);
14
-	}
12
+    public static function setUpBeforeClass(): void {
13
+        find_in_path('base/abstract_sql.php', '', true);
14
+    }
15 15
 
16
-	protected function setUp(): void {
17
-		if ($this->getSqlType() !== 'mysql') {
18
-			$this->markTestSkipped('Needs a Mysql database');
19
-		}
20
-	}
16
+    protected function setUp(): void {
17
+        if ($this->getSqlType() !== 'mysql') {
18
+            $this->markTestSkipped('Needs a Mysql database');
19
+        }
20
+    }
21 21
 
22
-	#[DataProvider('providerMysqlSqliIn')]
23
-	public function testMysqlSqlIn($expected, ...$args): void {
24
-		$this->assertEquals($expected, sql_in(...$args));
25
-	}
22
+    #[DataProvider('providerMysqlSqliIn')]
23
+    public function testMysqlSqlIn($expected, ...$args): void {
24
+        $this->assertEquals($expected, sql_in(...$args));
25
+    }
26 26
 
27
-	public static function providerMysqlSqliIn(): array {
28
-		return [
29
-			0 =>
30
-			[
31
-				0 => '(id_rubrique  IN (1,2,3))',
32
-				1 => 'id_rubrique',
33
-				2 => '1,2,3',
34
-			],
35
-			1 =>
36
-			[
37
-				0 => '(id_rubrique  IN (1,2,3))',
38
-				1 => 'id_rubrique',
39
-				2 =>
40
-				[
41
-					0 => 1,
42
-					1 => 2,
43
-					2 => 3,
44
-				],
45
-			],
46
-			2 =>
47
-			[
48
-				0 => '(id_rubrique NOT IN (1,2,3))',
49
-				1 => 'id_rubrique',
50
-				2 => '1,2,3',
51
-				3 => 'NOT',
52
-			],
53
-			3 =>
54
-			[
55
-				0 => '(id_rubrique NOT IN (1,2,3))',
56
-				1 => 'id_rubrique',
57
-				2 =>
58
-				[
59
-					0 => 1,
60
-					1 => 2,
61
-					2 => 3,
62
-				],
63
-				3 => 'NOT',
64
-			],
65
-			4 =>
66
-			[
67
-				0 => '0=1',
68
-				1 => 'id_rubrique',
69
-				2 =>
70
-				[],
71
-			],
72
-			5 =>
73
-			[
74
-				0 => '(id_rubrique  IN (\'\',0,\'Un texte avec des <a href=\"http://spip.net\">liens</a> [Article 1->art1] [spip->https://www.spip.net] https://www.spip.net\',\'Un texte avec des entit&eacute;s &amp;&lt;&gt;&quot;\',\'Un texte avec des entit&amp;eacute;s echap&amp;eacute; &amp;amp;&amp;lt;&amp;gt;&amp;quot;\',\'Un texte avec des entit&#233;s num&#233;riques &#38;&#60;&#62;&quot;\',\'Un texte avec des entit&amp;#233;s num&amp;#233;riques echap&amp;#233;es &amp;#38;&amp;#60;&amp;#62;&amp;quot;\',\'Un texte sans entites &<>\"\\\'\',\'{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>\',\'Un modele <modeleinexistant|lien=[->https://www.spip.net]>\',\'Un texte avec des retour
27
+    public static function providerMysqlSqliIn(): array {
28
+        return [
29
+            0 =>
30
+            [
31
+                0 => '(id_rubrique  IN (1,2,3))',
32
+                1 => 'id_rubrique',
33
+                2 => '1,2,3',
34
+            ],
35
+            1 =>
36
+            [
37
+                0 => '(id_rubrique  IN (1,2,3))',
38
+                1 => 'id_rubrique',
39
+                2 =>
40
+                [
41
+                    0 => 1,
42
+                    1 => 2,
43
+                    2 => 3,
44
+                ],
45
+            ],
46
+            2 =>
47
+            [
48
+                0 => '(id_rubrique NOT IN (1,2,3))',
49
+                1 => 'id_rubrique',
50
+                2 => '1,2,3',
51
+                3 => 'NOT',
52
+            ],
53
+            3 =>
54
+            [
55
+                0 => '(id_rubrique NOT IN (1,2,3))',
56
+                1 => 'id_rubrique',
57
+                2 =>
58
+                [
59
+                    0 => 1,
60
+                    1 => 2,
61
+                    2 => 3,
62
+                ],
63
+                3 => 'NOT',
64
+            ],
65
+            4 =>
66
+            [
67
+                0 => '0=1',
68
+                1 => 'id_rubrique',
69
+                2 =>
70
+                [],
71
+            ],
72
+            5 =>
73
+            [
74
+                0 => '(id_rubrique  IN (\'\',0,\'Un texte avec des <a href=\"http://spip.net\">liens</a> [Article 1->art1] [spip->https://www.spip.net] https://www.spip.net\',\'Un texte avec des entit&eacute;s &amp;&lt;&gt;&quot;\',\'Un texte avec des entit&amp;eacute;s echap&amp;eacute; &amp;amp;&amp;lt;&amp;gt;&amp;quot;\',\'Un texte avec des entit&#233;s num&#233;riques &#38;&#60;&#62;&quot;\',\'Un texte avec des entit&amp;#233;s num&amp;#233;riques echap&amp;#233;es &amp;#38;&amp;#60;&amp;#62;&amp;quot;\',\'Un texte sans entites &<>\"\\\'\',\'{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>\',\'Un modele <modeleinexistant|lien=[->https://www.spip.net]>\',\'Un texte avec des retour
75 75
 a la ligne et meme des
76 76
 
77 77
 paragraphes\'))',
78
-				1 => 'id_rubrique',
79
-				2 =>
80
-				[
81
-					0 => '',
82
-					1 => '0',
83
-					2 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->https://www.spip.net] https://www.spip.net',
84
-					3 => 'Un texte avec des entit&eacute;s &amp;&lt;&gt;&quot;',
85
-					4 => 'Un texte avec des entit&amp;eacute;s echap&amp;eacute; &amp;amp;&amp;lt;&amp;gt;&amp;quot;',
86
-					5 => 'Un texte avec des entit&#233;s num&#233;riques &#38;&#60;&#62;&quot;',
87
-					6 => 'Un texte avec des entit&amp;#233;s num&amp;#233;riques echap&amp;#233;es &amp;#38;&amp;#60;&amp;#62;&amp;quot;',
88
-					7 => 'Un texte sans entites &<>"\'',
89
-					8 => '{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>',
90
-					9 => 'Un modele <modeleinexistant|lien=[->https://www.spip.net]>',
91
-					10 => 'Un texte avec des retour
78
+                1 => 'id_rubrique',
79
+                2 =>
80
+                [
81
+                    0 => '',
82
+                    1 => '0',
83
+                    2 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->https://www.spip.net] https://www.spip.net',
84
+                    3 => 'Un texte avec des entit&eacute;s &amp;&lt;&gt;&quot;',
85
+                    4 => 'Un texte avec des entit&amp;eacute;s echap&amp;eacute; &amp;amp;&amp;lt;&amp;gt;&amp;quot;',
86
+                    5 => 'Un texte avec des entit&#233;s num&#233;riques &#38;&#60;&#62;&quot;',
87
+                    6 => 'Un texte avec des entit&amp;#233;s num&amp;#233;riques echap&amp;#233;es &amp;#38;&amp;#60;&amp;#62;&amp;quot;',
88
+                    7 => 'Un texte sans entites &<>"\'',
89
+                    8 => '{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>',
90
+                    9 => 'Un modele <modeleinexistant|lien=[->https://www.spip.net]>',
91
+                    10 => 'Un texte avec des retour
92 92
 a la ligne et meme des
93 93
 
94 94
 paragraphes',
95
-				],
96
-			],
97
-			6 =>
98
-			[
99
-				0 => '(id_rubrique  IN (0,-1,1,2,3,4,5,6,7,10,20,30,50,100,1000,10000))',
100
-				1 => 'id_rubrique',
101
-				2 =>
102
-				[
103
-					0 => 0,
104
-					1 => -1,
105
-					2 => 1,
106
-					3 => 2,
107
-					4 => 3,
108
-					5 => 4,
109
-					6 => 5,
110
-					7 => 6,
111
-					8 => 7,
112
-					9 => 10,
113
-					10 => 20,
114
-					11 => 30,
115
-					12 => 50,
116
-					13 => 100,
117
-					14 => 1000,
118
-					15 => 10000,
119
-				],
120
-			],
121
-			7 =>
122
-			[
123
-				0 => '0=1',
124
-				1 => 'id_rubrique',
125
-				2 =>
126
-				[
127
-					0 =>
128
-					[],
129
-					1 =>
130
-					[
131
-						0 => '',
132
-						1 => '0',
133
-						2 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->https://www.spip.net] https://www.spip.net',
134
-						3 => 'Un texte avec des entit&eacute;s &amp;&lt;&gt;&quot;',
135
-						4 => 'Un texte avec des entit&amp;eacute;s echap&amp;eacute; &amp;amp;&amp;lt;&amp;gt;&amp;quot;',
136
-						5 => 'Un texte avec des entit&#233;s num&#233;riques &#38;&#60;&#62;&quot;',
137
-						6 => 'Un texte avec des entit&amp;#233;s num&amp;#233;riques echap&amp;#233;es &amp;#38;&amp;#60;&amp;#62;&amp;quot;',
138
-						7 => 'Un texte sans entites &<>"\'',
139
-						8 => '{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>',
140
-						9 => 'Un modele <modeleinexistant|lien=[->https://www.spip.net]>',
141
-						10 => 'Un texte avec des retour
95
+                ],
96
+            ],
97
+            6 =>
98
+            [
99
+                0 => '(id_rubrique  IN (0,-1,1,2,3,4,5,6,7,10,20,30,50,100,1000,10000))',
100
+                1 => 'id_rubrique',
101
+                2 =>
102
+                [
103
+                    0 => 0,
104
+                    1 => -1,
105
+                    2 => 1,
106
+                    3 => 2,
107
+                    4 => 3,
108
+                    5 => 4,
109
+                    6 => 5,
110
+                    7 => 6,
111
+                    8 => 7,
112
+                    9 => 10,
113
+                    10 => 20,
114
+                    11 => 30,
115
+                    12 => 50,
116
+                    13 => 100,
117
+                    14 => 1000,
118
+                    15 => 10000,
119
+                ],
120
+            ],
121
+            7 =>
122
+            [
123
+                0 => '0=1',
124
+                1 => 'id_rubrique',
125
+                2 =>
126
+                [
127
+                    0 =>
128
+                    [],
129
+                    1 =>
130
+                    [
131
+                        0 => '',
132
+                        1 => '0',
133
+                        2 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->https://www.spip.net] https://www.spip.net',
134
+                        3 => 'Un texte avec des entit&eacute;s &amp;&lt;&gt;&quot;',
135
+                        4 => 'Un texte avec des entit&amp;eacute;s echap&amp;eacute; &amp;amp;&amp;lt;&amp;gt;&amp;quot;',
136
+                        5 => 'Un texte avec des entit&#233;s num&#233;riques &#38;&#60;&#62;&quot;',
137
+                        6 => 'Un texte avec des entit&amp;#233;s num&amp;#233;riques echap&amp;#233;es &amp;#38;&amp;#60;&amp;#62;&amp;quot;',
138
+                        7 => 'Un texte sans entites &<>"\'',
139
+                        8 => '{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>',
140
+                        9 => 'Un modele <modeleinexistant|lien=[->https://www.spip.net]>',
141
+                        10 => 'Un texte avec des retour
142 142
 a la ligne et meme des
143 143
 
144 144
 paragraphes',
145
-					],
146
-					2 =>
147
-					[
148
-						0 => 0,
149
-						1 => -1,
150
-						2 => 1,
151
-						3 => 2,
152
-						4 => 3,
153
-						5 => 4,
154
-						6 => 5,
155
-						7 => 6,
156
-						8 => 7,
157
-						9 => 10,
158
-						10 => 20,
159
-						11 => 30,
160
-						12 => 50,
161
-						13 => 100,
162
-						14 => 1000,
163
-						15 => 10000,
164
-					],
165
-					3 =>
166
-					[
167
-						0 => true,
168
-						1 => false,
169
-					],
170
-				],
171
-			],
172
-			8 =>
173
-			[
174
-				0 => '(id_rubrique  IN (2))',
175
-				1 => 'id_rubrique',
176
-				2 => 2,
177
-			],
178
-			9 =>
179
-			[
180
-				0 => '(id_rubrique  IN (1,0))',
181
-				1 => 'id_rubrique',
182
-				2 =>
183
-				[
184
-					0 => true,
185
-					1 => false,
186
-				],
187
-			],
188
-		];
189
-	}
145
+                    ],
146
+                    2 =>
147
+                    [
148
+                        0 => 0,
149
+                        1 => -1,
150
+                        2 => 1,
151
+                        3 => 2,
152
+                        4 => 3,
153
+                        5 => 4,
154
+                        6 => 5,
155
+                        7 => 6,
156
+                        8 => 7,
157
+                        9 => 10,
158
+                        10 => 20,
159
+                        11 => 30,
160
+                        12 => 50,
161
+                        13 => 100,
162
+                        14 => 1000,
163
+                        15 => 10000,
164
+                    ],
165
+                    3 =>
166
+                    [
167
+                        0 => true,
168
+                        1 => false,
169
+                    ],
170
+                ],
171
+            ],
172
+            8 =>
173
+            [
174
+                0 => '(id_rubrique  IN (2))',
175
+                1 => 'id_rubrique',
176
+                2 => 2,
177
+            ],
178
+            9 =>
179
+            [
180
+                0 => '(id_rubrique  IN (1,0))',
181
+                1 => 'id_rubrique',
182
+                2 =>
183
+                [
184
+                    0 => true,
185
+                    1 => false,
186
+                ],
187
+            ],
188
+        ];
189
+    }
190 190
 
191
-	private function getSqlType(): string {
192
-		return $GLOBALS['connexions'][0]['type'] ?? '';
193
-	}
191
+    private function getSqlType(): string {
192
+        return $GLOBALS['connexions'][0]['type'] ?? '';
193
+    }
194 194
 }
Please login to merge, or discard this patch.
ecrire/tests/Sql/SqlSchemaTableTest.php 2 patches
Spacing   +16 added lines, -16 removed lines patch added patch discarded remove patch
@@ -63,8 +63,8 @@  discard block
 block discarded – undo
63 63
 	#[Depends('testInsertData')]
64 64
 	public function testMajTimestamp() {
65 65
 		$table = 'spip_test_tintin';
66
-		$where1 = 'id_tintin=' . sql_quote(1);
67
-		$where2 = 'id_tintin=' . sql_quote(2);
66
+		$where1 = 'id_tintin='.sql_quote(1);
67
+		$where2 = 'id_tintin='.sql_quote(2);
68 68
 
69 69
 		// lecture du timestamp actuel
70 70
 		$maj1 = sql_getfetsel('maj', $table, $where1);
@@ -123,17 +123,17 @@  discard block
 block discarded – undo
123 123
 		$this->assertEquals(count($data), sql_count($res), 'sql_count() ne renvoie pas la valeur attendue');
124 124
 
125 125
 		// selection float
126
-		$res = sql_select('*', 'spip_test_tintin', ['un_double>' . sql_quote(3)]);
126
+		$res = sql_select('*', 'spip_test_tintin', ['un_double>'.sql_quote(3)]);
127 127
 		$n = count(array_filter($data, fn ($entry) => $entry['un_double'] > 3));
128 128
 		$this->assertEquals($n, sql_count($res), 'sql_count() ne renvoie pas la valeur attendue sur un float');
129 129
 
130 130
 		// selection REGEXP
131
-		$res = sql_select('*', 'spip_test_tintin', ['un_varchar REGEXP ' . sql_quote('^De')]);
131
+		$res = sql_select('*', 'spip_test_tintin', ['un_varchar REGEXP '.sql_quote('^De')]);
132 132
 		$n = count(array_filter($data, fn ($entry) => str_starts_with($entry['un_varchar'], 'De')));
133 133
 		$this->assertEquals($n, sql_count($res), 'sql_count() ne renvoie pas la valeur attendue sur une REGEXP');
134 134
 
135 135
 		// selection LIKE
136
-		$res = sql_select('*', 'spip_test_tintin', ['un_varchar LIKE ' . sql_quote('De%')]);
136
+		$res = sql_select('*', 'spip_test_tintin', ['un_varchar LIKE '.sql_quote('De%')]);
137 137
 		$this->assertEquals($n, sql_count($res), 'sql_count() ne renvoie pas la valeur attendue sur un LIKE');
138 138
 
139 139
 		// selection array(champs)
@@ -167,7 +167,7 @@  discard block
 block discarded – undo
167 167
 				'en' => 'Krack',
168 168
 			] as $lg => $res
169 169
 		) {
170
-			$multi = sql_getfetsel(sql_multi('grrrr', $lg), 'spip_test_milou', 'id_milou=' . sql_quote(2));
170
+			$multi = sql_getfetsel(sql_multi('grrrr', $lg), 'spip_test_milou', 'id_milou='.sql_quote(2));
171 171
 			$this->assertEquals($res, $multi, 'sql_multi mal rendu');
172 172
 		}
173 173
 
@@ -178,7 +178,7 @@  discard block
 block discarded – undo
178 178
 				'en' => 'Aérieny',
179 179
 			] as $lg => $res
180 180
 		) {
181
-			$multi = sql_getfetsel(sql_multi('alcool', $lg), 'spip_test_haddock', 'id_haddock=' . sql_quote(2));
181
+			$multi = sql_getfetsel(sql_multi('alcool', $lg), 'spip_test_haddock', 'id_haddock='.sql_quote(2));
182 182
 			$this->assertEquals($res, $multi, 'sql_multi avec accents, mal rendu');
183 183
 		}
184 184
 
@@ -190,7 +190,7 @@  discard block
 block discarded – undo
190 190
 				'de' => 'Un début de chaine : Vinasse, et [la fin]',
191 191
 			] as $lg => $res
192 192
 		) {
193
-			$multi = sql_getfetsel(sql_multi('alcool', $lg), 'spip_test_haddock', 'id_haddock=' . sql_quote(4));
193
+			$multi = sql_getfetsel(sql_multi('alcool', $lg), 'spip_test_haddock', 'id_haddock='.sql_quote(4));
194 194
 			$this->assertEquals($res, $multi, 'sql_multi avec crochets, mal rendu');
195 195
 		}
196 196
 	}
@@ -291,10 +291,10 @@  discard block
 block discarded – undo
291 291
 				'2.0/2' => (2.0 / 2),
292 292
 				'2/2' => (2 / 2),
293 293
 				'md5(8)' => md5('8'),
294
-				'md5(' . sql_quote('a') . ')' => md5('a'),
294
+				'md5('.sql_quote('a').')' => md5('a'),
295 295
 			] as $func => $expected
296 296
 		) {
297
-			$nb = sql_getfetsel("{$func} AS nb", ['spip_test_tintin'], ['id_tintin=' . sql_quote(1)]);
297
+			$nb = sql_getfetsel("{$func} AS nb", ['spip_test_tintin'], ['id_tintin='.sql_quote(1)]);
298 298
 			$this->assertEquals($expected, $nb, "Selection {$func} en echec");
299 299
 		}
300 300
 	}
@@ -307,11 +307,11 @@  discard block
 block discarded – undo
307 307
 	function testStringFunctions() {
308 308
 		foreach (
309 309
 			[
310
-				'CONCAT(' . sql_quote('cou') . ',' . sql_quote('cou') . ')' => 'coucou',
311
-				'CONCAT(' . sql_quote('cou,') . ',' . sql_quote('cou') . ')' => 'cou,cou',
310
+				'CONCAT('.sql_quote('cou').','.sql_quote('cou').')' => 'coucou',
311
+				'CONCAT('.sql_quote('cou,').','.sql_quote('cou').')' => 'cou,cou',
312 312
 			] as $func => $expected
313 313
 		) {
314
-			$nb = sql_getfetsel("{$func} AS nb", ['spip_test_tintin'], ['id_tintin=' . sql_quote(1)]);
314
+			$nb = sql_getfetsel("{$func} AS nb", ['spip_test_tintin'], ['id_tintin='.sql_quote(1)]);
315 315
 			$this->assertEquals($expected, $nb, "Selection {$func} en echec");
316 316
 		}
317 317
 	}
@@ -339,11 +339,11 @@  discard block
 block discarded – undo
339 339
 	#[Depends('testInsertData')]
340 340
 	public function testUpdateData() {
341 341
 		// ajouter un champ
342
-		$nb = sql_getfetsel('un_bigint', 'spip_test_tintin', 'id_tintin=' . sql_quote(1));
342
+		$nb = sql_getfetsel('un_bigint', 'spip_test_tintin', 'id_tintin='.sql_quote(1));
343 343
 		sql_update('spip_test_tintin', [
344 344
 			'un_bigint' => 'un_bigint+2',
345 345
 		]);
346
-		$nb2 = sql_getfetsel('un_bigint', 'spip_test_tintin', 'id_tintin=' . sql_quote(1));
346
+		$nb2 = sql_getfetsel('un_bigint', 'spip_test_tintin', 'id_tintin='.sql_quote(1));
347 347
 		$this->assertEquals($nb + 2, $nb2, 'sql_update n’a pas fait l’adition !');
348 348
 	}
349 349
 
@@ -355,7 +355,7 @@  discard block
 block discarded – undo
355 355
 	public function test_delete_data() {
356 356
 		$nb = sql_countsel('spip_test_tintin');
357 357
 		// supprimer une ligne
358
-		sql_delete('spip_test_tintin', 'id_tintin=' . sql_quote(1));
358
+		sql_delete('spip_test_tintin', 'id_tintin='.sql_quote(1));
359 359
 		$this->assertEquals($nb - 1, sql_countsel('spip_test_tintin'), "sql_delete n’a pas supprimé la ligne");
360 360
 
361 361
 		// supprimer tout
Please login to merge, or discard this patch.
Indentation   +685 added lines, -685 removed lines patch added patch discarded remove patch
@@ -10,689 +10,689 @@
 block discarded – undo
10 10
 
11 11
 class SqlSchemaTableTest extends TestCase
12 12
 {
13
-	public static function setUpBeforeClass(): void
14
-	{
15
-		find_in_path('base/abstract_sql.php', '', true);
16
-	}
17
-
18
-	#[DataProvider('providerTablesData')]
19
-	public function testDropTablesSetup($table, $desc, $data): void
20
-	{
21
-		$this->assertTrue(sql_drop_table($table, true));
22
-	}
23
-
24
-	#[Depends('testDropTablesSetup')]
25
-	#[DataProvider('providerTablesData')]
26
-	public function testCreateTables($table, $desc, $data): void
27
-	{
28
-		$this->assertTrue(sql_create($table, $desc['field'], $desc['key']));
29
-	}
30
-
31
-	/**
32
-	 * Creation/suppression/analyse de tables dans la base de donnee
33
-	 *
34
-	 * Permet de verifier que
35
-	 * - tous les champs sont correctement ajoutes
36
-	 * - que les PRIMARY sont pris en compte
37
-	 * - que les KEY sont prises en compte
38
-	 */
39
-	#[Depends('testCreateTables')]
40
-	#[DataProvider('providerTablesData')]
41
-	public function testShowTable($table, $desc, $data) {
42
-		// lire la structure de la table
43
-		// la structure doit avoir le meme nombre de champs et de cle
44
-		// attention : la primary key DOIT etre dans les cle aussi
45
-		$_desc = sql_showtable($table);
46
-		$this->assertCount(count($desc['field']), $_desc['field']);
47
-		$this->assertCount($desc['nb_key_attendues'], $_desc['key']);
48
-	}
49
-
50
-	#[Depends('testCreateTables')]
51
-	#[DataProvider('providerTablesData')]
52
-	public function testInsertData($table, $desc, $data) {
53
-		$this->assertNotFalse(sql_insertq_multi($table, $data));
54
-		$this->assertEquals(count($data), sql_countsel($table));
55
-	}
56
-
57
-	/**
58
-	 * Teste que le champ "maj" s'actualise bien sur les update
59
-	 * ainsi que les autres champs !
60
-	 *
61
-	 * utilise sql_quote, sql_getfetsel, sql_update et sql_updateq.
62
-	 */
63
-	#[Depends('testInsertData')]
64
-	public function testMajTimestamp() {
65
-		$table = 'spip_test_tintin';
66
-		$where1 = 'id_tintin=' . sql_quote(1);
67
-		$where2 = 'id_tintin=' . sql_quote(2);
68
-
69
-		// lecture du timestamp actuel
70
-		$maj1 = sql_getfetsel('maj', $table, $where1);
71
-		$this->assertNotEmpty($maj1, "Le champ 'maj' n'a vraisemblablement pas recu de timestamp à l'insertion");
72
-
73
-		$maj2 = sql_getfetsel('maj', $table, $where2);
74
-		$this->assertNotEmpty($maj2, "Le champ 'maj' n'a vraisemblablement pas recu de timestamp à l'insertion");
75
-
76
-		// 1s de plus, sinon le timestamp ne change pas !
77
-		sleep(1);
78
-
79
-		// update
80
-		$texte = 'nouveau texte';
81
-		sql_update($table, [
82
-			'un_texte' => sql_quote($texte),
83
-		], $where1);
84
-
85
-		// comparaison timastamp
86
-		$maj_update = sql_getfetsel('maj', $table, $where1);
87
-		$this->assertNotEmpty($maj_update, "Le champ 'maj' est vide à l’update");
88
-		$this->assertNotFalse(strtotime($maj_update), "Le champ 'maj' est incorrect à l’update");
89
-		$this->assertNotEquals($maj1, $maj_update, "Le champ 'maj' n'a vraisemblablement pas été mis a jour lors de l'update");
90
-
91
-		// comparaison texte
92
-		$texte_update = sql_getfetsel('un_texte', $table, $where1);
93
-		$this->assertNotEmpty($texte_update, "Le champ 'un_texte' est vide à l’update");
94
-		$this->assertEquals($texte, $texte_update, "Le champ 'un_texte' n'est pas correctement rempli a l'update");
95
-
96
-		// idem avec updateq
97
-		$texte = 'encore un nouveau texte';
98
-		sql_updateq($table, [
99
-			'un_texte' => $texte,
100
-		], $where2);
101
-
102
-		// comparaison timastamp
103
-		$maj_updateq = sql_getfetsel('maj', $table, $where2);
104
-		$this->assertNotEmpty($maj_updateq, "Le champ 'maj' est vide à l’updateq");
105
-		$this->assertNotFalse(strtotime($maj_updateq), "Le champ 'maj' est incorrect à l’updateq");
106
-		$this->assertNotEquals($maj1, $maj_updateq, "Le champ 'maj' n'a vraisemblablement pas été mis a jour lors de l'updateq");
107
-
108
-		// comparaison texte
109
-		$texte_updateq = sql_getfetsel('un_texte', $table, $where2);
110
-		$this->assertNotEmpty($texte_updateq, "Le champ 'un_texte' est vide à l’updateq");
111
-		$this->assertEquals($texte, $texte_updateq, "Le champ 'un_texte' n'est pas correctement rempli a l'updateq");
112
-	}
113
-
114
-	/**
115
-	 * Selections diverses selon criteres
116
-	 */
117
-	#[Depends('testInsertData')]
118
-	public function testSelections() {
119
-		$data = $this->providerTablesData()['tintin'][2];
120
-
121
-		$res = sql_select('*', 'spip_test_tintin');
122
-		$this->assertNotFalse($res);
123
-		$this->assertEquals(count($data), sql_count($res), 'sql_count() ne renvoie pas la valeur attendue');
124
-
125
-		// selection float
126
-		$res = sql_select('*', 'spip_test_tintin', ['un_double>' . sql_quote(3)]);
127
-		$n = count(array_filter($data, fn ($entry) => $entry['un_double'] > 3));
128
-		$this->assertEquals($n, sql_count($res), 'sql_count() ne renvoie pas la valeur attendue sur un float');
129
-
130
-		// selection REGEXP
131
-		$res = sql_select('*', 'spip_test_tintin', ['un_varchar REGEXP ' . sql_quote('^De')]);
132
-		$n = count(array_filter($data, fn ($entry) => str_starts_with($entry['un_varchar'], 'De')));
133
-		$this->assertEquals($n, sql_count($res), 'sql_count() ne renvoie pas la valeur attendue sur une REGEXP');
134
-
135
-		// selection LIKE
136
-		$res = sql_select('*', 'spip_test_tintin', ['un_varchar LIKE ' . sql_quote('De%')]);
137
-		$this->assertEquals($n, sql_count($res), 'sql_count() ne renvoie pas la valeur attendue sur un LIKE');
138
-
139
-		// selection array(champs)
140
-		$res = sql_fetsel(['id_tintin', 'un_varchar'], 'spip_test_tintin');
141
-		$this->assertArrayHasKey('id_tintin', $res);
142
-		$this->assertArrayHasKey('un_varchar', $res);
143
-
144
-		// selection array(champs=>alias)
145
-		$res = sql_fetsel(['id_tintin AS id', 'un_varchar AS vchar'], 'spip_test_tintin');
146
-		$this->assertArrayHasKey('id', $res);
147
-		$this->assertArrayHasKey('vchar', $res);
148
-	}
149
-
150
-
151
-	#[Depends('testInsertData')]
152
-	public function testSelectionsMulti() {
153
-		$data = $this->providerTablesData()['milou'][2];
154
-
155
-		// selection avec sql_multi
156
-		$res = sql_select(['id_milou', sql_multi('grrrr', 'fr')], 'spip_test_milou', orderby: 'multi');
157
-		$this->assertNotFalse($res);
158
-		$this->assertEquals(count($data), sql_count($res), 'sql_multi mal interprété');
159
-		$this->assertEquals(3, sql_fetch($res)['id_milou'], 'sql_multi order by multi raté');
160
-		$this->assertEquals(2, sql_fetch($res)['id_milou'], 'sql_multi order by multi raté');
161
-		$this->assertEquals(1, sql_fetch($res)['id_milou'], 'sql_multi order by multi raté');
162
-
163
-		// le bon texte avec multi
164
-		foreach (
165
-			[
166
-				'fr' => 'Crac',
167
-				'en' => 'Krack',
168
-			] as $lg => $res
169
-		) {
170
-			$multi = sql_getfetsel(sql_multi('grrrr', $lg), 'spip_test_milou', 'id_milou=' . sql_quote(2));
171
-			$this->assertEquals($res, $multi, 'sql_multi mal rendu');
172
-		}
173
-
174
-		// le bon texte avec multi et accents
175
-		foreach (
176
-			[
177
-				'fr' => 'Aérien',
178
-				'en' => 'Aérieny',
179
-			] as $lg => $res
180
-		) {
181
-			$multi = sql_getfetsel(sql_multi('alcool', $lg), 'spip_test_haddock', 'id_haddock=' . sql_quote(2));
182
-			$this->assertEquals($res, $multi, 'sql_multi avec accents, mal rendu');
183
-		}
184
-
185
-		// le bon texte avec multi et debut et fin de chaine
186
-		foreach (
187
-			[
188
-				'fr' => 'Un début de chaine : Vinasse, et [la fin]',
189
-				'en' => 'Un début de chaine : Vinassy, et [la fin]',
190
-				'de' => 'Un début de chaine : Vinasse, et [la fin]',
191
-			] as $lg => $res
192
-		) {
193
-			$multi = sql_getfetsel(sql_multi('alcool', $lg), 'spip_test_haddock', 'id_haddock=' . sql_quote(4));
194
-			$this->assertEquals($res, $multi, 'sql_multi avec crochets, mal rendu');
195
-		}
196
-	}
197
-
198
-
199
-
200
-	/**
201
-	 * Selections diverses entre plusieurs tables
202
-	 */
203
-	#[Depends('testInsertData')]
204
-	public function testSelectionsEntreTable() {
205
-		// selection 2 tables
206
-		// ! nombre en dur !
207
-		$res = sql_select(
208
-			['spip_test_tintin.id_tintin', 'spip_test_milou.id_milou'],
209
-			['spip_test_tintin', 'spip_test_milou'],
210
-			['spip_test_milou.id_tintin=spip_test_tintin.id_tintin']
211
-		);
212
-		$this->assertEquals(3, sql_count($res), 'Echec sélection');
213
-
214
-		// selection 2 tables avec alias =>
215
-		// ! nombre en dur !
216
-		$res = sql_select(
217
-			['a.id_tintin AS x', 'b.id_milou AS y'],
218
-			[
219
-				'a' => 'spip_test_tintin',
220
-				'b' => 'spip_test_milou',
221
-			],
222
-			['a.id_tintin=b.id_tintin']
223
-		);
224
-		$this->assertEquals(3, sql_count($res), 'Echec sélection avec alias de colonnes et tables');
225
-
226
-		// selection 2 tables avec alias AS
227
-		// ! nombre en dur !
228
-		$res = sql_select(
229
-			['a.id_tintin AS x', 'b.id_milou AS y'],
230
-			['spip_test_tintin AS a', 'spip_test_milou AS b'],
231
-			['a.id_tintin=b.id_tintin']
232
-		);
233
-		$this->assertEquals(3, sql_count($res));
234
-
235
-		// selection 2 tables avec INNER JOIN + ON
236
-		// ! nombre en dur !
237
-		$res = sql_select(
238
-			['a.id_tintin AS x', 'b.id_milou AS y'],
239
-			['spip_test_tintin AS a INNER JOIN spip_test_milou AS b ON (a.id_tintin=b.id_tintin)']
240
-		);
241
-		$this->assertEquals(3, sql_count($res), 'Echec sélection avec INNER JOIN + ON');
242
-
243
-		// selection 2 tables avec LEFT JOIN + ON
244
-		// ! nombre en dur !
245
-		$res = sql_select(
246
-			['a.id_tintin AS x', 'b.id_milou AS y'],
247
-			['spip_test_tintin AS a LEFT JOIN spip_test_milou AS b ON (a.id_tintin=b.id_tintin)']
248
-		);
249
-		$this->assertEquals(4, sql_count($res), 'Echec sélection avec LEFT JOIN + ON');
250
-
251
-
252
-		// selection 2 tables avec jointure INNER JOIN + USING
253
-		// ! nombre en dur !
254
-		// SQLite 2 se plante : il ne connait pas USING (enleve de la requete,
255
-		// et du coup ne fait pas correctement la jointure)
256
-		$res = sql_select(
257
-			['a.id_tintin AS x', 'b.id_milou AS y'],
258
-			['spip_test_tintin AS a INNER JOIN spip_test_milou AS b USING (id_tintin)']
259
-		);
260
-		$this->assertEquals(3, sql_count($res), 'Echec sélection avec INNER JOIN + USING');
261
-	}
262
-
263
-
264
-	/**
265
-	 * Selections mathematiques
266
-	 */
267
-	#[Depends('testInsertData')]
268
-	function testMathFunctions() {
269
-		foreach (
270
-			[
271
-				'COUNT' => 3,
272
-				'SUM' => 9000,
273
-				'AVG' => 3000,
274
-			] as $func => $expected
275
-		) {
276
-			$nb = sql_getfetsel("{$func}(un_int) AS nb", ['spip_test_tintin']);
277
-			$this->assertEquals($expected, $nb, "Selection {$func} en echec");
278
-		}
279
-
280
-		foreach (
281
-			[
282
-				'EXP(0)' => exp(0),
283
-				'ROUND(3.56)' => round(3.56),
284
-				'ROUND(3.5684,2)' => round(3.5684, 2),
285
-				'SQRT(9)' => 3,
286
-				//'1/2'=>(0), // Le standard SQL : entier divise par entier = division entiere (pas trouve la reference)
287
-				'1.0/2' => (1 / 2), // Le standart SQL : reel divise par entier = reel
288
-				//'4/3'=>1,
289
-				'ROUND(4.0/3,2)' => round(4 / 3, 2),
290
-				'1.5/2' => (1.5 / 2),
291
-				'2.0/2' => (2.0 / 2),
292
-				'2/2' => (2 / 2),
293
-				'md5(8)' => md5('8'),
294
-				'md5(' . sql_quote('a') . ')' => md5('a'),
295
-			] as $func => $expected
296
-		) {
297
-			$nb = sql_getfetsel("{$func} AS nb", ['spip_test_tintin'], ['id_tintin=' . sql_quote(1)]);
298
-			$this->assertEquals($expected, $nb, "Selection {$func} en echec");
299
-		}
300
-	}
301
-
302
-	/**
303
-	 * Selections mathematiques
304
-	 */
305
-	#[Depends('testInsertData')]
306
-
307
-	function testStringFunctions() {
308
-		foreach (
309
-			[
310
-				'CONCAT(' . sql_quote('cou') . ',' . sql_quote('cou') . ')' => 'coucou',
311
-				'CONCAT(' . sql_quote('cou,') . ',' . sql_quote('cou') . ')' => 'cou,cou',
312
-			] as $func => $expected
313
-		) {
314
-			$nb = sql_getfetsel("{$func} AS nb", ['spip_test_tintin'], ['id_tintin=' . sql_quote(1)]);
315
-			$this->assertEquals($expected, $nb, "Selection {$func} en echec");
316
-		}
317
-	}
318
-
319
-	/**
320
-	 * retours des fonctions d'erreurs lors d'une requete
321
-	 */
322
-	#[Depends('testCreateTables')]
323
-
324
-	function testErrorFunctions() {
325
-		// requete sans erreur
326
-		sql_select('*', 'spip_test_tintin');
327
-		$this->assertEquals('', sql_error(), 'sql_error() non vide lors d’une requete sans erreur');
328
-		$this->assertEquals(0, sql_errno(), 'sql_errno() ne retourne pas 0 lors d’une requete sans erreur');
329
-
330
-		// requete en erreur
331
-		sql_select('*', 'spip_test_toto');
332
-		$this->assertNotEquals('', sql_error(), 'sql_error() vide lors d’une requete en erreur');
333
-		$this->assertNotEquals(0, sql_errno(), 'sql_errno() retourne 0 lors d’une requete en erreur');
334
-	}
335
-
336
-	/**
337
-	 * Update de data
338
-	 */
339
-	#[Depends('testInsertData')]
340
-	public function testUpdateData() {
341
-		// ajouter un champ
342
-		$nb = sql_getfetsel('un_bigint', 'spip_test_tintin', 'id_tintin=' . sql_quote(1));
343
-		sql_update('spip_test_tintin', [
344
-			'un_bigint' => 'un_bigint+2',
345
-		]);
346
-		$nb2 = sql_getfetsel('un_bigint', 'spip_test_tintin', 'id_tintin=' . sql_quote(1));
347
-		$this->assertEquals($nb + 2, $nb2, 'sql_update n’a pas fait l’adition !');
348
-	}
349
-
350
-	/**
351
-	 * Delete de data
352
-	 */
353
-	#[Depends('testInsertData')]
354
-
355
-	public function test_delete_data() {
356
-		$nb = sql_countsel('spip_test_tintin');
357
-		// supprimer une ligne
358
-		sql_delete('spip_test_tintin', 'id_tintin=' . sql_quote(1));
359
-		$this->assertEquals($nb - 1, sql_countsel('spip_test_tintin'), "sql_delete n’a pas supprimé la ligne");
360
-
361
-		// supprimer tout
362
-		sql_delete('spip_test_tintin');
363
-		$this->assertEquals(0, sql_countsel('spip_test_tintin'), "sql_delete n’a pas vidé la table");
364
-	}
365
-
366
-	/**
367
-	 * Alter colonne
368
-	 */
369
-	#[Depends('testCreateTables')]
370
-	function testAlterColumns() {
371
-		$table = 'spip_test_tintin';
372
-
373
-		// supprimer une colonne
374
-		sql_alter("TABLE {$table} DROP COLUMN un_bigint");
375
-		$desc = sql_showtable($table);
376
-		$this->assertIsArray($desc, 'sql_alter rate DROP COLUMN (plus de table ou sql_showtable en erreur?)');
377
-		$this->assertArrayNotHasKey('un_bigint', $desc['field']);
378
-		$this->assertArrayHasKey('un_smallint', $desc['field']);
379
-
380
-		// supprimer une colonne (sans COLUMN)
381
-		sql_alter("TABLE {$table} DROP un_smallint");
382
-		$desc = sql_showtable($table);
383
-		$this->assertIsArray($desc, 'sql_alter rate DROP sans COLUMN (plus de table ou sql_showtable en erreur?)');
384
-		$this->assertArrayNotHasKey('un_smallint', $desc['field']);
385
-
386
-		// renommer une colonne
387
-		sql_alter("TABLE {$table} CHANGE un_varchar deux_varchars VARCHAR(30) NOT NULL DEFAULT ''");
388
-		$desc = sql_showtable($table);
389
-		$this->assertIsArray($desc, 'sql_alter rate CHANGE (plus de table ou sql_showtable en erreur?)');
390
-		$this->assertArrayHasKey('deux_varchars', $desc['field']);
391
-		$this->assertArrayNotHasKey('un_varchar', $desc['field']);
392
-
393
-		// changer le type d'une colonne
394
-		$table = 'spip_test_milou';
395
-		sql_alter("TABLE {$table} MODIFY schtroumf TEXT NOT NULL DEFAULT ''");
396
-		$desc = sql_showtable($table);
397
-		$this->assertIsArray($desc, 'sql_alter rate MODIFY (plus de table ou sql_showtable en erreur?)');
398
-		$this->assertArrayHasKey('schtroumf', $desc['field'], 'sql_alter rate MODIFY varchar en text');
399
-		$this->assertStringContainsStringIgnoringCase('TEXT', $desc['field']['schtroumf'], 'sql_alter rate MODIFY varchar en text');
400
-
401
-		// ajouter des colonnes
402
-		sql_alter("TABLE {$table} ADD COLUMN houba BIGINT(21) NOT NULL DEFAULT '0'");
403
-		$desc = sql_showtable($table);
404
-		$this->assertIsArray($desc, 'sql_alter rate ADD COLUMN (plus de table ou sql_showtable en erreur?)');
405
-		$this->assertArrayHasKey('houba', $desc['field'], 'sql_alter rate ADD COLUMN');
406
-		$this->assertStringContainsStringIgnoringCase('INT', $desc['field']['houba'], 'sql_alter rate ADD COLUMN');
407
-
408
-		// ajouter des colonnes avec "AFTER"
409
-		sql_alter("TABLE {$table} ADD COLUMN hop BIGINT(21) NOT NULL DEFAULT '0' AFTER id_tintin");
410
-		$desc = sql_showtable($table);
411
-		$this->assertIsArray($desc, 'sql_alter rate ADD COLUMN avec AFTER (plus de table ou sql_showtable en erreur?)');
412
-		$this->assertArrayHasKey('hop', $desc['field'], 'sql_alter rate ADD COLUMN avec AFTER');
413
-		$this->assertStringContainsStringIgnoringCase('INT', $desc['field']['hop'], 'sql_alter rate ADD COLUMN avec AFTER');
414
-	}
415
-
416
-
417
-	/**
418
-	 * Renomme table
419
-	 */
420
-	#[Depends('testCreateTables')]
421
-
422
-	public function testAlterRenameTable() {
423
-
424
-		$table_before = 'spip_test_tintin';
425
-		$table_after = 'spip_test_castafiore';
426
-		sql_drop_table($table_after, true);
427
-		$this->assertEmpty(sql_showtable($table_after));
428
-		$this->assertIsArray(sql_showtable($table_before));
429
-
430
-		// renommer une table
431
-		sql_alter("TABLE {$table_before} RENAME {$table_after}");
432
-		$this->assertEmpty(sql_showtable($table_before));
433
-		$this->assertIsArray(sql_showtable($table_after));
434
-
435
-		sql_alter("TABLE {$table_after} RENAME {$table_before}");
436
-		$this->assertEmpty(sql_showtable($table_after));
437
-		$this->assertIsArray(sql_showtable($table_before));
438
-	}
439
-
440
-
441
-	/**
442
-	 * pointer l'index
443
-	 */
444
-	#[Depends('testCreateTables')]
445
-
446
-	public function testAlterIndex() {
447
-		$table = 'spip_test_milou';
448
-
449
-		// supprimer un index
450
-		sql_alter("TABLE {$table} DROP INDEX sons");
451
-		$desc = sql_showtable($table);
452
-		$this->assertIsArray($desc, 'sql_alter rate DROP INDEX sons (plus de table ou sql_showtable en erreur?)');
453
-		$this->assertArrayNotHasKey('KEY sons', $desc['key'], 'sql_alter rate DROP INDEX sons');
454
-
455
-		// ajouter un index simple
456
-		sql_alter("TABLE {$table} ADD INDEX (wouaf)");
457
-		$desc = sql_showtable($table);
458
-		$this->assertIsArray($desc, 'sql_alter rate ADD INDEX (wouaf) (plus de table ou sql_showtable en erreur?)');
459
-		$this->assertArrayHasKey('KEY wouaf', $desc['key'], 'sql_alter rate ADD INDEX (wouaf)');
460
-
461
-		// ajouter un index nomme
462
-		sql_alter("TABLE {$table} ADD INDEX pluie (grrrr)");
463
-		$desc = sql_showtable($table);
464
-		$this->assertIsArray($desc, 'sql_alter rate ADD INDEX pluie (grrrr) (plus de table ou sql_showtable en erreur?)');
465
-		$this->assertArrayHasKey('KEY pluie', $desc['key'], 'sql_alter rate ADD INDEX pluie (grrrr)');
466
-
467
-		// supprimer un index
468
-		sql_alter("TABLE {$table} DROP INDEX pluie");
469
-		$desc = sql_showtable($table);
470
-		$this->assertIsArray($desc, 'sql_alter rate DROP INDEX pluie (plus de table ou sql_showtable en erreur?)');
471
-		$this->assertArrayNotHasKey('KEY pluie', $desc['key'], 'sql_alter rate DROP INDEX pluie');
472
-
473
-		// ajouter un index nomme double
474
-		sql_alter("TABLE {$table} ADD INDEX dring (grrrr, wouaf)");
475
-		$desc = sql_showtable($table);
476
-		$this->assertIsArray($desc, 'sql_alter rate ADD INDEX dring (grrrr, wouaf) (plus de table ou sql_showtable en erreur?)');
477
-		$this->assertArrayHasKey('KEY dring', $desc['key'], 'sql_alter rate ADD INDEX dring (grrrr, wouaf)');
478
-	}
479
-
480
-
481
-	/**
482
-	 * dezinguer la primary
483
-	 */
484
-	#[Depends('testCreateTables')]
485
-
486
-	public function testAlterPrimary() {
487
-		$table = 'spip_test_kirikou';
488
-		sql_drop_table($table, true);
489
-
490
-		// creer une table pour jouer
491
-		sql_create(
492
-			$table,
493
-			[
494
-				'un' => 'INTEGER NOT NULL',
495
-				'deux' => 'INTEGER NOT NULL',
496
-				'trois' => 'INTEGER NOT NULL',
497
-			],
498
-			[
499
-				'PRIMARY KEY' => 'un',
500
-			]
501
-		);
502
-
503
-		// supprimer une primary
504
-		$desc = sql_showtable($table);
505
-		sql_alter("TABLE {$table} DROP PRIMARY KEY");
506
-		$desc = sql_showtable($table);
507
-		$this->assertIsArray($desc, 'sql_alter rate DROP PRIMARY KEY (plus de table ou sql_showtable en erreur?)');
508
-		$this->assertArrayNotHasKey('PRIMARY KEY', $desc['key'], 'sql_alter rate DROP PRIMARY KEY');
509
-
510
-		// ajouter une primary
511
-		$desc = sql_showtable($table);
512
-		sql_alter("TABLE {$table} ADD PRIMARY KEY (deux, trois)");
513
-		$desc = sql_showtable($table);
514
-		$this->assertIsArray($desc, 'sql_alter rate ADD PRIMARY KEY (plus de table ou sql_showtable en erreur?)');
515
-		$this->assertArrayHasKey('PRIMARY KEY', $desc['key'], 'sql_alter rate ADD PRIMARY KEY');
516
-
517
-		sql_drop_table($table, true);
518
-	}
519
-
520
-	/**
521
-	 * Alter colonne
522
-	 */
523
-	#[Depends('testAlterColumns')]
524
-	#[Depends('testAlterIndex')]
525
-
526
-	function testAlterMultiple() {
527
-		$table = 'spip_test_milou';
528
-
529
-		// supprimer des colonnes
530
-		sql_alter("TABLE {$table} DROP INDEX dring, DROP COLUMN wouaf, DROP COLUMN grrrr");
531
-		$desc = sql_showtable($table);
532
-		$this->assertIsArray($desc, 'sql_alter rate DROP multiples (plus de table ou sql_showtable en erreur?)');
533
-		$this->assertArrayNotHasKey('waouf', $desc['field'], 'sql_alter rate DROP multiples');
534
-		$this->assertArrayNotHasKey('grrrr', $desc['field'], 'sql_alter rate DROP multiples');
535
-		$this->assertArrayNotHasKey('KEY dring', $desc['key'], 'sql_alter rate DROP multiples');
536
-
537
-		// ajouter des colonnes
538
-		sql_alter("TABLE {$table} ADD COLUMN a INT, ADD COLUMN b INT, ADD COLUMN c INT, ADD INDEX abc (a,b,c)");
539
-		$desc = sql_showtable($table);
540
-		$this->assertIsArray($desc, 'sql_alter rate ADD multiples (plus de table ou sql_showtable en erreur?)');
541
-		$this->assertArrayHasKey('a', $desc['field'], 'sql_alter rate ADD multiples');
542
-		$this->assertArrayHasKey('b', $desc['field'], 'sql_alter rate ADD multiples');
543
-		$this->assertArrayHasKey('c', $desc['field'], 'sql_alter rate ADD multiples');
544
-		$this->assertArrayHasKey('KEY abc', $desc['key'], 'sql_alter rate ADD multiples');
545
-	}
546
-
547
-	#[Depends('testCreateTables')]
548
-	#[DataProvider('providerTablesData')]
549
-	public function testDropTables($table, $desc, $data): void
550
-	{
551
-		$this->assertTrue(sql_drop_table($table, false));
552
-	}
553
-
554
-	/**
555
-	 * Description des tables & données de tests
556
-	 */
557
-	public static function providerTablesData(): array
558
-	{
559
-		return [
560
-			'tintin' => [
561
-				'spip_test_tintin',
562
-				[
563
-					'field' => [
564
-						"id_tintin" => "INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY",
565
-						"un_bigint" => "BIGINT(21) NOT NULL DEFAULT '0'",
566
-						"un_int" => "BIGINT(21) NOT NULL DEFAULT '0'",
567
-						"un_smallint" => "SMALLINT(3) NOT NULL DEFAULT '0'",
568
-						"un_double" => "DOUBLE NOT NULL DEFAULT '0'",
569
-						"un_tinyint" => "TINYINT(2) NOT NULL DEFAULT '0'",
570
-						"un_varchar" => "VARCHAR(30) NOT NULL DEFAULT ''",
571
-						"un_texte" => "TEXT NOT NULL DEFAULT ''",
572
-						"maj" => "TIMESTAMP"
573
-					],
574
-					'key' => [
575
-
576
-					],
577
-					'nb_key_attendues' => 1 // attention : la primary key DOIT etre dans les cle aussi
578
-				],
579
-				[
580
-					[
581
-						"id_tintin" => 1,
582
-						"un_bigint" => 30000,
583
-						"un_int" => 2000,
584
-						"un_smallint" => 40,
585
-						"un_double" => 2.58,
586
-						"un_tinyint" => 8,
587
-						"un_varchar" => "Premier varchar",
588
-						"un_texte" => "Premier texte",
589
-						//"maj" => "" // doit se remplir automatiquement
590
-					],
591
-					[
592
-						"id_tintin" => 2,
593
-						"un_bigint" => 40000,
594
-						"un_int" => 3000,
595
-						"un_smallint" => 50,
596
-						"un_double" => 3.58,
597
-						"un_tinyint" => 9,
598
-						"un_varchar" => "Deuxieme varchar",
599
-						"un_texte" => "Second texte",
600
-						//"maj" => "" // doit se remplir automatiquement
601
-					],
602
-					[
603
-						"id_tintin" => 3,
604
-						"un_bigint" => 60000,
605
-						"un_int" => 4000,
606
-						"un_smallint" => 70,
607
-						"un_double" => 8.58,
608
-						"un_tinyint" => 3,
609
-						"un_varchar" => "Troisieme varchar",
610
-						"un_texte" => "Troisieme texte",
611
-						//"maj" => "" // doit se remplir automatiquement
612
-					],
613
-				],
614
-
615
-			],
616
-			'milou' => [
617
-				'spip_test_milou',
618
-				[
619
-					'field' => [
620
-						"id_milou" => "INTEGER NOT NULL AUTO_INCREMENT",
621
-						"id_tintin" => "INTEGER NOT NULL",
622
-						"un_enum" => "ENUM('blanc','noir') NOT NULL DEFAULT 'blanc'",
623
-						"wouaf" => "VARCHAR(80) NOT NULL DEFAULT ''",
624
-						"grrrr" => "VARCHAR(80) NOT NULL DEFAULT ''",
625
-						"schtroumf" => "VARCHAR(80) NOT NULL DEFAULT ''",
626
-						"maj" => "TIMESTAMP"
627
-					],
628
-					'key' => [
629
-						"PRIMARY KEY" => "id_milou",
630
-						"KEY id_tintin" => "id_tintin",
631
-						"KEY sons" => "wouaf, grrrr",
632
-					],
633
-					'nb_key_attendues' => 3 // attention : la primary key DOIT etre dans les cle aussi
634
-				],
635
-				[
636
-					[
637
-						"id_milou" => 1,
638
-						"id_tintin" => 1,
639
-						"un_enum" => "blanc",
640
-						"wouaf" => "Warf !!",
641
-						"grrrr" => "Grogne !",
642
-						// "maj" => "" // doit se remplir automatiquement
643
-					],
644
-					[
645
-						"id_milou" => 2,
646
-						"id_tintin" => 1,
647
-						"un_enum" => "noir",
648
-						"wouaf" => "Wouf",
649
-						"grrrr" => "<multi>[fr]Crac[en]Krack</multi>",
650
-						// "maj" => "" // doit se remplir automatiquement
651
-					],
652
-					[
653
-						"id_milou" => 3,
654
-						"id_tintin" => 2,
655
-						"un_enum" => "blanc",
656
-						"wouaf" => "Wif",
657
-						"grrrr" => "Ahrg",
658
-						// "maj" => "" // doit se remplir automatiquement
659
-					],
660
-				],
661
-
662
-			],
663
-			'haddock' => [
664
-				'spip_test_haddock',
665
-				[
666
-					'field' => [
667
-						"id_haddock" => "INTEGER NOT NULL AUTO_INCREMENT",
668
-						"alcool" => "VARCHAR(80) NOT NULL DEFAULT ''",
669
-
670
-					],
671
-					'key' => [
672
-						"PRIMARY KEY" => "id_haddock",
673
-					],
674
-					'nb_key_attendues' => 1 // attention : la primary key DOIT etre dans les cle aussi
675
-				],
676
-				[
677
-					[
678
-						"id_haddock" => 1,
679
-						"alcool" => "<multi>[fr]Agile[en]Agily</multi>",
680
-					],
681
-					[
682
-						"id_haddock" => 2,
683
-						"alcool" => "<multi>[fr]Aérien[en]Aérieny</multi>",
684
-					],
685
-					[
686
-						"id_haddock" => 3,
687
-						"alcool" => "<multi>[fr]Vinasse[en]Vinassy</multi>",
688
-					],
689
-					[
690
-						"id_haddock" => 4,
691
-						"alcool" => "Un début de chaine : <multi>[fr]Vinasse[en]Vinassy</multi>, et [la fin]",
692
-					],
693
-				],
694
-
695
-			],
696
-		];
697
-	}
13
+    public static function setUpBeforeClass(): void
14
+    {
15
+        find_in_path('base/abstract_sql.php', '', true);
16
+    }
17
+
18
+    #[DataProvider('providerTablesData')]
19
+    public function testDropTablesSetup($table, $desc, $data): void
20
+    {
21
+        $this->assertTrue(sql_drop_table($table, true));
22
+    }
23
+
24
+    #[Depends('testDropTablesSetup')]
25
+    #[DataProvider('providerTablesData')]
26
+    public function testCreateTables($table, $desc, $data): void
27
+    {
28
+        $this->assertTrue(sql_create($table, $desc['field'], $desc['key']));
29
+    }
30
+
31
+    /**
32
+     * Creation/suppression/analyse de tables dans la base de donnee
33
+     *
34
+     * Permet de verifier que
35
+     * - tous les champs sont correctement ajoutes
36
+     * - que les PRIMARY sont pris en compte
37
+     * - que les KEY sont prises en compte
38
+     */
39
+    #[Depends('testCreateTables')]
40
+    #[DataProvider('providerTablesData')]
41
+    public function testShowTable($table, $desc, $data) {
42
+        // lire la structure de la table
43
+        // la structure doit avoir le meme nombre de champs et de cle
44
+        // attention : la primary key DOIT etre dans les cle aussi
45
+        $_desc = sql_showtable($table);
46
+        $this->assertCount(count($desc['field']), $_desc['field']);
47
+        $this->assertCount($desc['nb_key_attendues'], $_desc['key']);
48
+    }
49
+
50
+    #[Depends('testCreateTables')]
51
+    #[DataProvider('providerTablesData')]
52
+    public function testInsertData($table, $desc, $data) {
53
+        $this->assertNotFalse(sql_insertq_multi($table, $data));
54
+        $this->assertEquals(count($data), sql_countsel($table));
55
+    }
56
+
57
+    /**
58
+     * Teste que le champ "maj" s'actualise bien sur les update
59
+     * ainsi que les autres champs !
60
+     *
61
+     * utilise sql_quote, sql_getfetsel, sql_update et sql_updateq.
62
+     */
63
+    #[Depends('testInsertData')]
64
+    public function testMajTimestamp() {
65
+        $table = 'spip_test_tintin';
66
+        $where1 = 'id_tintin=' . sql_quote(1);
67
+        $where2 = 'id_tintin=' . sql_quote(2);
68
+
69
+        // lecture du timestamp actuel
70
+        $maj1 = sql_getfetsel('maj', $table, $where1);
71
+        $this->assertNotEmpty($maj1, "Le champ 'maj' n'a vraisemblablement pas recu de timestamp à l'insertion");
72
+
73
+        $maj2 = sql_getfetsel('maj', $table, $where2);
74
+        $this->assertNotEmpty($maj2, "Le champ 'maj' n'a vraisemblablement pas recu de timestamp à l'insertion");
75
+
76
+        // 1s de plus, sinon le timestamp ne change pas !
77
+        sleep(1);
78
+
79
+        // update
80
+        $texte = 'nouveau texte';
81
+        sql_update($table, [
82
+            'un_texte' => sql_quote($texte),
83
+        ], $where1);
84
+
85
+        // comparaison timastamp
86
+        $maj_update = sql_getfetsel('maj', $table, $where1);
87
+        $this->assertNotEmpty($maj_update, "Le champ 'maj' est vide à l’update");
88
+        $this->assertNotFalse(strtotime($maj_update), "Le champ 'maj' est incorrect à l’update");
89
+        $this->assertNotEquals($maj1, $maj_update, "Le champ 'maj' n'a vraisemblablement pas été mis a jour lors de l'update");
90
+
91
+        // comparaison texte
92
+        $texte_update = sql_getfetsel('un_texte', $table, $where1);
93
+        $this->assertNotEmpty($texte_update, "Le champ 'un_texte' est vide à l’update");
94
+        $this->assertEquals($texte, $texte_update, "Le champ 'un_texte' n'est pas correctement rempli a l'update");
95
+
96
+        // idem avec updateq
97
+        $texte = 'encore un nouveau texte';
98
+        sql_updateq($table, [
99
+            'un_texte' => $texte,
100
+        ], $where2);
101
+
102
+        // comparaison timastamp
103
+        $maj_updateq = sql_getfetsel('maj', $table, $where2);
104
+        $this->assertNotEmpty($maj_updateq, "Le champ 'maj' est vide à l’updateq");
105
+        $this->assertNotFalse(strtotime($maj_updateq), "Le champ 'maj' est incorrect à l’updateq");
106
+        $this->assertNotEquals($maj1, $maj_updateq, "Le champ 'maj' n'a vraisemblablement pas été mis a jour lors de l'updateq");
107
+
108
+        // comparaison texte
109
+        $texte_updateq = sql_getfetsel('un_texte', $table, $where2);
110
+        $this->assertNotEmpty($texte_updateq, "Le champ 'un_texte' est vide à l’updateq");
111
+        $this->assertEquals($texte, $texte_updateq, "Le champ 'un_texte' n'est pas correctement rempli a l'updateq");
112
+    }
113
+
114
+    /**
115
+     * Selections diverses selon criteres
116
+     */
117
+    #[Depends('testInsertData')]
118
+    public function testSelections() {
119
+        $data = $this->providerTablesData()['tintin'][2];
120
+
121
+        $res = sql_select('*', 'spip_test_tintin');
122
+        $this->assertNotFalse($res);
123
+        $this->assertEquals(count($data), sql_count($res), 'sql_count() ne renvoie pas la valeur attendue');
124
+
125
+        // selection float
126
+        $res = sql_select('*', 'spip_test_tintin', ['un_double>' . sql_quote(3)]);
127
+        $n = count(array_filter($data, fn ($entry) => $entry['un_double'] > 3));
128
+        $this->assertEquals($n, sql_count($res), 'sql_count() ne renvoie pas la valeur attendue sur un float');
129
+
130
+        // selection REGEXP
131
+        $res = sql_select('*', 'spip_test_tintin', ['un_varchar REGEXP ' . sql_quote('^De')]);
132
+        $n = count(array_filter($data, fn ($entry) => str_starts_with($entry['un_varchar'], 'De')));
133
+        $this->assertEquals($n, sql_count($res), 'sql_count() ne renvoie pas la valeur attendue sur une REGEXP');
134
+
135
+        // selection LIKE
136
+        $res = sql_select('*', 'spip_test_tintin', ['un_varchar LIKE ' . sql_quote('De%')]);
137
+        $this->assertEquals($n, sql_count($res), 'sql_count() ne renvoie pas la valeur attendue sur un LIKE');
138
+
139
+        // selection array(champs)
140
+        $res = sql_fetsel(['id_tintin', 'un_varchar'], 'spip_test_tintin');
141
+        $this->assertArrayHasKey('id_tintin', $res);
142
+        $this->assertArrayHasKey('un_varchar', $res);
143
+
144
+        // selection array(champs=>alias)
145
+        $res = sql_fetsel(['id_tintin AS id', 'un_varchar AS vchar'], 'spip_test_tintin');
146
+        $this->assertArrayHasKey('id', $res);
147
+        $this->assertArrayHasKey('vchar', $res);
148
+    }
149
+
150
+
151
+    #[Depends('testInsertData')]
152
+    public function testSelectionsMulti() {
153
+        $data = $this->providerTablesData()['milou'][2];
154
+
155
+        // selection avec sql_multi
156
+        $res = sql_select(['id_milou', sql_multi('grrrr', 'fr')], 'spip_test_milou', orderby: 'multi');
157
+        $this->assertNotFalse($res);
158
+        $this->assertEquals(count($data), sql_count($res), 'sql_multi mal interprété');
159
+        $this->assertEquals(3, sql_fetch($res)['id_milou'], 'sql_multi order by multi raté');
160
+        $this->assertEquals(2, sql_fetch($res)['id_milou'], 'sql_multi order by multi raté');
161
+        $this->assertEquals(1, sql_fetch($res)['id_milou'], 'sql_multi order by multi raté');
162
+
163
+        // le bon texte avec multi
164
+        foreach (
165
+            [
166
+                'fr' => 'Crac',
167
+                'en' => 'Krack',
168
+            ] as $lg => $res
169
+        ) {
170
+            $multi = sql_getfetsel(sql_multi('grrrr', $lg), 'spip_test_milou', 'id_milou=' . sql_quote(2));
171
+            $this->assertEquals($res, $multi, 'sql_multi mal rendu');
172
+        }
173
+
174
+        // le bon texte avec multi et accents
175
+        foreach (
176
+            [
177
+                'fr' => 'Aérien',
178
+                'en' => 'Aérieny',
179
+            ] as $lg => $res
180
+        ) {
181
+            $multi = sql_getfetsel(sql_multi('alcool', $lg), 'spip_test_haddock', 'id_haddock=' . sql_quote(2));
182
+            $this->assertEquals($res, $multi, 'sql_multi avec accents, mal rendu');
183
+        }
184
+
185
+        // le bon texte avec multi et debut et fin de chaine
186
+        foreach (
187
+            [
188
+                'fr' => 'Un début de chaine : Vinasse, et [la fin]',
189
+                'en' => 'Un début de chaine : Vinassy, et [la fin]',
190
+                'de' => 'Un début de chaine : Vinasse, et [la fin]',
191
+            ] as $lg => $res
192
+        ) {
193
+            $multi = sql_getfetsel(sql_multi('alcool', $lg), 'spip_test_haddock', 'id_haddock=' . sql_quote(4));
194
+            $this->assertEquals($res, $multi, 'sql_multi avec crochets, mal rendu');
195
+        }
196
+    }
197
+
198
+
199
+
200
+    /**
201
+     * Selections diverses entre plusieurs tables
202
+     */
203
+    #[Depends('testInsertData')]
204
+    public function testSelectionsEntreTable() {
205
+        // selection 2 tables
206
+        // ! nombre en dur !
207
+        $res = sql_select(
208
+            ['spip_test_tintin.id_tintin', 'spip_test_milou.id_milou'],
209
+            ['spip_test_tintin', 'spip_test_milou'],
210
+            ['spip_test_milou.id_tintin=spip_test_tintin.id_tintin']
211
+        );
212
+        $this->assertEquals(3, sql_count($res), 'Echec sélection');
213
+
214
+        // selection 2 tables avec alias =>
215
+        // ! nombre en dur !
216
+        $res = sql_select(
217
+            ['a.id_tintin AS x', 'b.id_milou AS y'],
218
+            [
219
+                'a' => 'spip_test_tintin',
220
+                'b' => 'spip_test_milou',
221
+            ],
222
+            ['a.id_tintin=b.id_tintin']
223
+        );
224
+        $this->assertEquals(3, sql_count($res), 'Echec sélection avec alias de colonnes et tables');
225
+
226
+        // selection 2 tables avec alias AS
227
+        // ! nombre en dur !
228
+        $res = sql_select(
229
+            ['a.id_tintin AS x', 'b.id_milou AS y'],
230
+            ['spip_test_tintin AS a', 'spip_test_milou AS b'],
231
+            ['a.id_tintin=b.id_tintin']
232
+        );
233
+        $this->assertEquals(3, sql_count($res));
234
+
235
+        // selection 2 tables avec INNER JOIN + ON
236
+        // ! nombre en dur !
237
+        $res = sql_select(
238
+            ['a.id_tintin AS x', 'b.id_milou AS y'],
239
+            ['spip_test_tintin AS a INNER JOIN spip_test_milou AS b ON (a.id_tintin=b.id_tintin)']
240
+        );
241
+        $this->assertEquals(3, sql_count($res), 'Echec sélection avec INNER JOIN + ON');
242
+
243
+        // selection 2 tables avec LEFT JOIN + ON
244
+        // ! nombre en dur !
245
+        $res = sql_select(
246
+            ['a.id_tintin AS x', 'b.id_milou AS y'],
247
+            ['spip_test_tintin AS a LEFT JOIN spip_test_milou AS b ON (a.id_tintin=b.id_tintin)']
248
+        );
249
+        $this->assertEquals(4, sql_count($res), 'Echec sélection avec LEFT JOIN + ON');
250
+
251
+
252
+        // selection 2 tables avec jointure INNER JOIN + USING
253
+        // ! nombre en dur !
254
+        // SQLite 2 se plante : il ne connait pas USING (enleve de la requete,
255
+        // et du coup ne fait pas correctement la jointure)
256
+        $res = sql_select(
257
+            ['a.id_tintin AS x', 'b.id_milou AS y'],
258
+            ['spip_test_tintin AS a INNER JOIN spip_test_milou AS b USING (id_tintin)']
259
+        );
260
+        $this->assertEquals(3, sql_count($res), 'Echec sélection avec INNER JOIN + USING');
261
+    }
262
+
263
+
264
+    /**
265
+     * Selections mathematiques
266
+     */
267
+    #[Depends('testInsertData')]
268
+    function testMathFunctions() {
269
+        foreach (
270
+            [
271
+                'COUNT' => 3,
272
+                'SUM' => 9000,
273
+                'AVG' => 3000,
274
+            ] as $func => $expected
275
+        ) {
276
+            $nb = sql_getfetsel("{$func}(un_int) AS nb", ['spip_test_tintin']);
277
+            $this->assertEquals($expected, $nb, "Selection {$func} en echec");
278
+        }
279
+
280
+        foreach (
281
+            [
282
+                'EXP(0)' => exp(0),
283
+                'ROUND(3.56)' => round(3.56),
284
+                'ROUND(3.5684,2)' => round(3.5684, 2),
285
+                'SQRT(9)' => 3,
286
+                //'1/2'=>(0), // Le standard SQL : entier divise par entier = division entiere (pas trouve la reference)
287
+                '1.0/2' => (1 / 2), // Le standart SQL : reel divise par entier = reel
288
+                //'4/3'=>1,
289
+                'ROUND(4.0/3,2)' => round(4 / 3, 2),
290
+                '1.5/2' => (1.5 / 2),
291
+                '2.0/2' => (2.0 / 2),
292
+                '2/2' => (2 / 2),
293
+                'md5(8)' => md5('8'),
294
+                'md5(' . sql_quote('a') . ')' => md5('a'),
295
+            ] as $func => $expected
296
+        ) {
297
+            $nb = sql_getfetsel("{$func} AS nb", ['spip_test_tintin'], ['id_tintin=' . sql_quote(1)]);
298
+            $this->assertEquals($expected, $nb, "Selection {$func} en echec");
299
+        }
300
+    }
301
+
302
+    /**
303
+     * Selections mathematiques
304
+     */
305
+    #[Depends('testInsertData')]
306
+
307
+    function testStringFunctions() {
308
+        foreach (
309
+            [
310
+                'CONCAT(' . sql_quote('cou') . ',' . sql_quote('cou') . ')' => 'coucou',
311
+                'CONCAT(' . sql_quote('cou,') . ',' . sql_quote('cou') . ')' => 'cou,cou',
312
+            ] as $func => $expected
313
+        ) {
314
+            $nb = sql_getfetsel("{$func} AS nb", ['spip_test_tintin'], ['id_tintin=' . sql_quote(1)]);
315
+            $this->assertEquals($expected, $nb, "Selection {$func} en echec");
316
+        }
317
+    }
318
+
319
+    /**
320
+     * retours des fonctions d'erreurs lors d'une requete
321
+     */
322
+    #[Depends('testCreateTables')]
323
+
324
+    function testErrorFunctions() {
325
+        // requete sans erreur
326
+        sql_select('*', 'spip_test_tintin');
327
+        $this->assertEquals('', sql_error(), 'sql_error() non vide lors d’une requete sans erreur');
328
+        $this->assertEquals(0, sql_errno(), 'sql_errno() ne retourne pas 0 lors d’une requete sans erreur');
329
+
330
+        // requete en erreur
331
+        sql_select('*', 'spip_test_toto');
332
+        $this->assertNotEquals('', sql_error(), 'sql_error() vide lors d’une requete en erreur');
333
+        $this->assertNotEquals(0, sql_errno(), 'sql_errno() retourne 0 lors d’une requete en erreur');
334
+    }
335
+
336
+    /**
337
+     * Update de data
338
+     */
339
+    #[Depends('testInsertData')]
340
+    public function testUpdateData() {
341
+        // ajouter un champ
342
+        $nb = sql_getfetsel('un_bigint', 'spip_test_tintin', 'id_tintin=' . sql_quote(1));
343
+        sql_update('spip_test_tintin', [
344
+            'un_bigint' => 'un_bigint+2',
345
+        ]);
346
+        $nb2 = sql_getfetsel('un_bigint', 'spip_test_tintin', 'id_tintin=' . sql_quote(1));
347
+        $this->assertEquals($nb + 2, $nb2, 'sql_update n’a pas fait l’adition !');
348
+    }
349
+
350
+    /**
351
+     * Delete de data
352
+     */
353
+    #[Depends('testInsertData')]
354
+
355
+    public function test_delete_data() {
356
+        $nb = sql_countsel('spip_test_tintin');
357
+        // supprimer une ligne
358
+        sql_delete('spip_test_tintin', 'id_tintin=' . sql_quote(1));
359
+        $this->assertEquals($nb - 1, sql_countsel('spip_test_tintin'), "sql_delete n’a pas supprimé la ligne");
360
+
361
+        // supprimer tout
362
+        sql_delete('spip_test_tintin');
363
+        $this->assertEquals(0, sql_countsel('spip_test_tintin'), "sql_delete n’a pas vidé la table");
364
+    }
365
+
366
+    /**
367
+     * Alter colonne
368
+     */
369
+    #[Depends('testCreateTables')]
370
+    function testAlterColumns() {
371
+        $table = 'spip_test_tintin';
372
+
373
+        // supprimer une colonne
374
+        sql_alter("TABLE {$table} DROP COLUMN un_bigint");
375
+        $desc = sql_showtable($table);
376
+        $this->assertIsArray($desc, 'sql_alter rate DROP COLUMN (plus de table ou sql_showtable en erreur?)');
377
+        $this->assertArrayNotHasKey('un_bigint', $desc['field']);
378
+        $this->assertArrayHasKey('un_smallint', $desc['field']);
379
+
380
+        // supprimer une colonne (sans COLUMN)
381
+        sql_alter("TABLE {$table} DROP un_smallint");
382
+        $desc = sql_showtable($table);
383
+        $this->assertIsArray($desc, 'sql_alter rate DROP sans COLUMN (plus de table ou sql_showtable en erreur?)');
384
+        $this->assertArrayNotHasKey('un_smallint', $desc['field']);
385
+
386
+        // renommer une colonne
387
+        sql_alter("TABLE {$table} CHANGE un_varchar deux_varchars VARCHAR(30) NOT NULL DEFAULT ''");
388
+        $desc = sql_showtable($table);
389
+        $this->assertIsArray($desc, 'sql_alter rate CHANGE (plus de table ou sql_showtable en erreur?)');
390
+        $this->assertArrayHasKey('deux_varchars', $desc['field']);
391
+        $this->assertArrayNotHasKey('un_varchar', $desc['field']);
392
+
393
+        // changer le type d'une colonne
394
+        $table = 'spip_test_milou';
395
+        sql_alter("TABLE {$table} MODIFY schtroumf TEXT NOT NULL DEFAULT ''");
396
+        $desc = sql_showtable($table);
397
+        $this->assertIsArray($desc, 'sql_alter rate MODIFY (plus de table ou sql_showtable en erreur?)');
398
+        $this->assertArrayHasKey('schtroumf', $desc['field'], 'sql_alter rate MODIFY varchar en text');
399
+        $this->assertStringContainsStringIgnoringCase('TEXT', $desc['field']['schtroumf'], 'sql_alter rate MODIFY varchar en text');
400
+
401
+        // ajouter des colonnes
402
+        sql_alter("TABLE {$table} ADD COLUMN houba BIGINT(21) NOT NULL DEFAULT '0'");
403
+        $desc = sql_showtable($table);
404
+        $this->assertIsArray($desc, 'sql_alter rate ADD COLUMN (plus de table ou sql_showtable en erreur?)');
405
+        $this->assertArrayHasKey('houba', $desc['field'], 'sql_alter rate ADD COLUMN');
406
+        $this->assertStringContainsStringIgnoringCase('INT', $desc['field']['houba'], 'sql_alter rate ADD COLUMN');
407
+
408
+        // ajouter des colonnes avec "AFTER"
409
+        sql_alter("TABLE {$table} ADD COLUMN hop BIGINT(21) NOT NULL DEFAULT '0' AFTER id_tintin");
410
+        $desc = sql_showtable($table);
411
+        $this->assertIsArray($desc, 'sql_alter rate ADD COLUMN avec AFTER (plus de table ou sql_showtable en erreur?)');
412
+        $this->assertArrayHasKey('hop', $desc['field'], 'sql_alter rate ADD COLUMN avec AFTER');
413
+        $this->assertStringContainsStringIgnoringCase('INT', $desc['field']['hop'], 'sql_alter rate ADD COLUMN avec AFTER');
414
+    }
415
+
416
+
417
+    /**
418
+     * Renomme table
419
+     */
420
+    #[Depends('testCreateTables')]
421
+
422
+    public function testAlterRenameTable() {
423
+
424
+        $table_before = 'spip_test_tintin';
425
+        $table_after = 'spip_test_castafiore';
426
+        sql_drop_table($table_after, true);
427
+        $this->assertEmpty(sql_showtable($table_after));
428
+        $this->assertIsArray(sql_showtable($table_before));
429
+
430
+        // renommer une table
431
+        sql_alter("TABLE {$table_before} RENAME {$table_after}");
432
+        $this->assertEmpty(sql_showtable($table_before));
433
+        $this->assertIsArray(sql_showtable($table_after));
434
+
435
+        sql_alter("TABLE {$table_after} RENAME {$table_before}");
436
+        $this->assertEmpty(sql_showtable($table_after));
437
+        $this->assertIsArray(sql_showtable($table_before));
438
+    }
439
+
440
+
441
+    /**
442
+     * pointer l'index
443
+     */
444
+    #[Depends('testCreateTables')]
445
+
446
+    public function testAlterIndex() {
447
+        $table = 'spip_test_milou';
448
+
449
+        // supprimer un index
450
+        sql_alter("TABLE {$table} DROP INDEX sons");
451
+        $desc = sql_showtable($table);
452
+        $this->assertIsArray($desc, 'sql_alter rate DROP INDEX sons (plus de table ou sql_showtable en erreur?)');
453
+        $this->assertArrayNotHasKey('KEY sons', $desc['key'], 'sql_alter rate DROP INDEX sons');
454
+
455
+        // ajouter un index simple
456
+        sql_alter("TABLE {$table} ADD INDEX (wouaf)");
457
+        $desc = sql_showtable($table);
458
+        $this->assertIsArray($desc, 'sql_alter rate ADD INDEX (wouaf) (plus de table ou sql_showtable en erreur?)');
459
+        $this->assertArrayHasKey('KEY wouaf', $desc['key'], 'sql_alter rate ADD INDEX (wouaf)');
460
+
461
+        // ajouter un index nomme
462
+        sql_alter("TABLE {$table} ADD INDEX pluie (grrrr)");
463
+        $desc = sql_showtable($table);
464
+        $this->assertIsArray($desc, 'sql_alter rate ADD INDEX pluie (grrrr) (plus de table ou sql_showtable en erreur?)');
465
+        $this->assertArrayHasKey('KEY pluie', $desc['key'], 'sql_alter rate ADD INDEX pluie (grrrr)');
466
+
467
+        // supprimer un index
468
+        sql_alter("TABLE {$table} DROP INDEX pluie");
469
+        $desc = sql_showtable($table);
470
+        $this->assertIsArray($desc, 'sql_alter rate DROP INDEX pluie (plus de table ou sql_showtable en erreur?)');
471
+        $this->assertArrayNotHasKey('KEY pluie', $desc['key'], 'sql_alter rate DROP INDEX pluie');
472
+
473
+        // ajouter un index nomme double
474
+        sql_alter("TABLE {$table} ADD INDEX dring (grrrr, wouaf)");
475
+        $desc = sql_showtable($table);
476
+        $this->assertIsArray($desc, 'sql_alter rate ADD INDEX dring (grrrr, wouaf) (plus de table ou sql_showtable en erreur?)');
477
+        $this->assertArrayHasKey('KEY dring', $desc['key'], 'sql_alter rate ADD INDEX dring (grrrr, wouaf)');
478
+    }
479
+
480
+
481
+    /**
482
+     * dezinguer la primary
483
+     */
484
+    #[Depends('testCreateTables')]
485
+
486
+    public function testAlterPrimary() {
487
+        $table = 'spip_test_kirikou';
488
+        sql_drop_table($table, true);
489
+
490
+        // creer une table pour jouer
491
+        sql_create(
492
+            $table,
493
+            [
494
+                'un' => 'INTEGER NOT NULL',
495
+                'deux' => 'INTEGER NOT NULL',
496
+                'trois' => 'INTEGER NOT NULL',
497
+            ],
498
+            [
499
+                'PRIMARY KEY' => 'un',
500
+            ]
501
+        );
502
+
503
+        // supprimer une primary
504
+        $desc = sql_showtable($table);
505
+        sql_alter("TABLE {$table} DROP PRIMARY KEY");
506
+        $desc = sql_showtable($table);
507
+        $this->assertIsArray($desc, 'sql_alter rate DROP PRIMARY KEY (plus de table ou sql_showtable en erreur?)');
508
+        $this->assertArrayNotHasKey('PRIMARY KEY', $desc['key'], 'sql_alter rate DROP PRIMARY KEY');
509
+
510
+        // ajouter une primary
511
+        $desc = sql_showtable($table);
512
+        sql_alter("TABLE {$table} ADD PRIMARY KEY (deux, trois)");
513
+        $desc = sql_showtable($table);
514
+        $this->assertIsArray($desc, 'sql_alter rate ADD PRIMARY KEY (plus de table ou sql_showtable en erreur?)');
515
+        $this->assertArrayHasKey('PRIMARY KEY', $desc['key'], 'sql_alter rate ADD PRIMARY KEY');
516
+
517
+        sql_drop_table($table, true);
518
+    }
519
+
520
+    /**
521
+     * Alter colonne
522
+     */
523
+    #[Depends('testAlterColumns')]
524
+    #[Depends('testAlterIndex')]
525
+
526
+    function testAlterMultiple() {
527
+        $table = 'spip_test_milou';
528
+
529
+        // supprimer des colonnes
530
+        sql_alter("TABLE {$table} DROP INDEX dring, DROP COLUMN wouaf, DROP COLUMN grrrr");
531
+        $desc = sql_showtable($table);
532
+        $this->assertIsArray($desc, 'sql_alter rate DROP multiples (plus de table ou sql_showtable en erreur?)');
533
+        $this->assertArrayNotHasKey('waouf', $desc['field'], 'sql_alter rate DROP multiples');
534
+        $this->assertArrayNotHasKey('grrrr', $desc['field'], 'sql_alter rate DROP multiples');
535
+        $this->assertArrayNotHasKey('KEY dring', $desc['key'], 'sql_alter rate DROP multiples');
536
+
537
+        // ajouter des colonnes
538
+        sql_alter("TABLE {$table} ADD COLUMN a INT, ADD COLUMN b INT, ADD COLUMN c INT, ADD INDEX abc (a,b,c)");
539
+        $desc = sql_showtable($table);
540
+        $this->assertIsArray($desc, 'sql_alter rate ADD multiples (plus de table ou sql_showtable en erreur?)');
541
+        $this->assertArrayHasKey('a', $desc['field'], 'sql_alter rate ADD multiples');
542
+        $this->assertArrayHasKey('b', $desc['field'], 'sql_alter rate ADD multiples');
543
+        $this->assertArrayHasKey('c', $desc['field'], 'sql_alter rate ADD multiples');
544
+        $this->assertArrayHasKey('KEY abc', $desc['key'], 'sql_alter rate ADD multiples');
545
+    }
546
+
547
+    #[Depends('testCreateTables')]
548
+    #[DataProvider('providerTablesData')]
549
+    public function testDropTables($table, $desc, $data): void
550
+    {
551
+        $this->assertTrue(sql_drop_table($table, false));
552
+    }
553
+
554
+    /**
555
+     * Description des tables & données de tests
556
+     */
557
+    public static function providerTablesData(): array
558
+    {
559
+        return [
560
+            'tintin' => [
561
+                'spip_test_tintin',
562
+                [
563
+                    'field' => [
564
+                        "id_tintin" => "INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY",
565
+                        "un_bigint" => "BIGINT(21) NOT NULL DEFAULT '0'",
566
+                        "un_int" => "BIGINT(21) NOT NULL DEFAULT '0'",
567
+                        "un_smallint" => "SMALLINT(3) NOT NULL DEFAULT '0'",
568
+                        "un_double" => "DOUBLE NOT NULL DEFAULT '0'",
569
+                        "un_tinyint" => "TINYINT(2) NOT NULL DEFAULT '0'",
570
+                        "un_varchar" => "VARCHAR(30) NOT NULL DEFAULT ''",
571
+                        "un_texte" => "TEXT NOT NULL DEFAULT ''",
572
+                        "maj" => "TIMESTAMP"
573
+                    ],
574
+                    'key' => [
575
+
576
+                    ],
577
+                    'nb_key_attendues' => 1 // attention : la primary key DOIT etre dans les cle aussi
578
+                ],
579
+                [
580
+                    [
581
+                        "id_tintin" => 1,
582
+                        "un_bigint" => 30000,
583
+                        "un_int" => 2000,
584
+                        "un_smallint" => 40,
585
+                        "un_double" => 2.58,
586
+                        "un_tinyint" => 8,
587
+                        "un_varchar" => "Premier varchar",
588
+                        "un_texte" => "Premier texte",
589
+                        //"maj" => "" // doit se remplir automatiquement
590
+                    ],
591
+                    [
592
+                        "id_tintin" => 2,
593
+                        "un_bigint" => 40000,
594
+                        "un_int" => 3000,
595
+                        "un_smallint" => 50,
596
+                        "un_double" => 3.58,
597
+                        "un_tinyint" => 9,
598
+                        "un_varchar" => "Deuxieme varchar",
599
+                        "un_texte" => "Second texte",
600
+                        //"maj" => "" // doit se remplir automatiquement
601
+                    ],
602
+                    [
603
+                        "id_tintin" => 3,
604
+                        "un_bigint" => 60000,
605
+                        "un_int" => 4000,
606
+                        "un_smallint" => 70,
607
+                        "un_double" => 8.58,
608
+                        "un_tinyint" => 3,
609
+                        "un_varchar" => "Troisieme varchar",
610
+                        "un_texte" => "Troisieme texte",
611
+                        //"maj" => "" // doit se remplir automatiquement
612
+                    ],
613
+                ],
614
+
615
+            ],
616
+            'milou' => [
617
+                'spip_test_milou',
618
+                [
619
+                    'field' => [
620
+                        "id_milou" => "INTEGER NOT NULL AUTO_INCREMENT",
621
+                        "id_tintin" => "INTEGER NOT NULL",
622
+                        "un_enum" => "ENUM('blanc','noir') NOT NULL DEFAULT 'blanc'",
623
+                        "wouaf" => "VARCHAR(80) NOT NULL DEFAULT ''",
624
+                        "grrrr" => "VARCHAR(80) NOT NULL DEFAULT ''",
625
+                        "schtroumf" => "VARCHAR(80) NOT NULL DEFAULT ''",
626
+                        "maj" => "TIMESTAMP"
627
+                    ],
628
+                    'key' => [
629
+                        "PRIMARY KEY" => "id_milou",
630
+                        "KEY id_tintin" => "id_tintin",
631
+                        "KEY sons" => "wouaf, grrrr",
632
+                    ],
633
+                    'nb_key_attendues' => 3 // attention : la primary key DOIT etre dans les cle aussi
634
+                ],
635
+                [
636
+                    [
637
+                        "id_milou" => 1,
638
+                        "id_tintin" => 1,
639
+                        "un_enum" => "blanc",
640
+                        "wouaf" => "Warf !!",
641
+                        "grrrr" => "Grogne !",
642
+                        // "maj" => "" // doit se remplir automatiquement
643
+                    ],
644
+                    [
645
+                        "id_milou" => 2,
646
+                        "id_tintin" => 1,
647
+                        "un_enum" => "noir",
648
+                        "wouaf" => "Wouf",
649
+                        "grrrr" => "<multi>[fr]Crac[en]Krack</multi>",
650
+                        // "maj" => "" // doit se remplir automatiquement
651
+                    ],
652
+                    [
653
+                        "id_milou" => 3,
654
+                        "id_tintin" => 2,
655
+                        "un_enum" => "blanc",
656
+                        "wouaf" => "Wif",
657
+                        "grrrr" => "Ahrg",
658
+                        // "maj" => "" // doit se remplir automatiquement
659
+                    ],
660
+                ],
661
+
662
+            ],
663
+            'haddock' => [
664
+                'spip_test_haddock',
665
+                [
666
+                    'field' => [
667
+                        "id_haddock" => "INTEGER NOT NULL AUTO_INCREMENT",
668
+                        "alcool" => "VARCHAR(80) NOT NULL DEFAULT ''",
669
+
670
+                    ],
671
+                    'key' => [
672
+                        "PRIMARY KEY" => "id_haddock",
673
+                    ],
674
+                    'nb_key_attendues' => 1 // attention : la primary key DOIT etre dans les cle aussi
675
+                ],
676
+                [
677
+                    [
678
+                        "id_haddock" => 1,
679
+                        "alcool" => "<multi>[fr]Agile[en]Agily</multi>",
680
+                    ],
681
+                    [
682
+                        "id_haddock" => 2,
683
+                        "alcool" => "<multi>[fr]Aérien[en]Aérieny</multi>",
684
+                    ],
685
+                    [
686
+                        "id_haddock" => 3,
687
+                        "alcool" => "<multi>[fr]Vinasse[en]Vinassy</multi>",
688
+                    ],
689
+                    [
690
+                        "id_haddock" => 4,
691
+                        "alcool" => "Un début de chaine : <multi>[fr]Vinasse[en]Vinassy</multi>, et [la fin]",
692
+                    ],
693
+                ],
694
+
695
+            ],
696
+        ];
697
+    }
698 698
 }
Please login to merge, or discard this patch.
ecrire/tests/Sql/Objets/TableObjetTest.php 1 patch
Indentation   +86 added lines, -86 removed lines patch added patch discarded remove patch
@@ -13,92 +13,92 @@
 block discarded – undo
13 13
 
14 14
 class TableObjetTest extends TestCase
15 15
 {
16
-	public static function setUpBeforeClass(): void {
17
-		find_in_path('base/connect_sql.php', '', true);
18
-	}
16
+    public static function setUpBeforeClass(): void {
17
+        find_in_path('base/connect_sql.php', '', true);
18
+    }
19 19
 
20
-	#[DataProvider('providerConnectSqlTableObjet')]
21
-	public function testConnectSqlTableObjet($expected, ...$args): void {
22
-		$actual = table_objet(...$args);
23
-		$this->assertSame($expected, $actual);
24
-	}
20
+    #[DataProvider('providerConnectSqlTableObjet')]
21
+    public function testConnectSqlTableObjet($expected, ...$args): void {
22
+        $actual = table_objet(...$args);
23
+        $this->assertSame($expected, $actual);
24
+    }
25 25
 
26
-	public static function providerConnectSqlTableObjet(): array {
27
-		return [[
28
-			0 => 'articles',
29
-			1 => 'articles',
30
-		], [
31
-			0 => 'articles',
32
-			1 => 'article',
33
-		], [
34
-			0 => 'articles',
35
-			1 => 'spip_articles',
36
-		], [
37
-			0 => 'articles',
38
-			1 => 'id_article',
39
-		], [
40
-			0 => 'rubriques',
41
-			1 => 'rubrique',
42
-		], [
43
-			0 => 'rubriques',
44
-			1 => 'spip_rubriques',
45
-		], [
46
-			0 => 'rubriques',
47
-			1 => 'id_rubrique',
48
-		], [
49
-			0 => 'mots',
50
-			1 => 'mot',
51
-		], [
52
-			0 => 'mots',
53
-			1 => 'spip_mots',
54
-		], [
55
-			0 => 'mots',
56
-			1 => 'id_mot',
57
-		], [
58
-			0 => 'groupes_mots',
59
-			1 => 'groupe_mots',
60
-		], [
61
-			0 => 'groupes_mots',
62
-			1 => 'spip_groupes_mots',
63
-		], [
64
-			0 => 'groupes_mots',
65
-			1 => 'id_groupe',
66
-		], [
67
-			0 => 'groupes_mots',
68
-			1 => 'groupes_mot',
69
-		], [
70
-			0 => 'syndic',
71
-			1 => 'syndic',
72
-		], [
73
-			0 => 'syndic',
74
-			1 => 'site',
75
-		], [
76
-			0 => 'syndic',
77
-			1 => 'spip_syndic',
78
-		], [
79
-			0 => 'syndic',
80
-			1 => 'id_syndic',
81
-		], [
82
-			0 => 'syndic_articles',
83
-			1 => 'syndic_article',
84
-		], [
85
-			0 => 'syndic_articles',
86
-			1 => 'spip_syndic_articles',
87
-		], [
88
-			0 => 'syndic_articles',
89
-			1 => 'id_syndic_article',
90
-		], [
91
-			0 => 'syndic_articles',
92
-			1 => 'syndic_article',
93
-		], ['articles', 'article'], ['auteurs', 'auteur'], ['documents', 'document'], ['documents', 'doc'], [
94
-			'documents',
95
-			'img',
96
-		], ['documents', 'img'], ['forums', 'forum'], [
97
-			'groupes_mots',
98
-			'groupe_mots',
99
-		], ['groupes_mots', 'groupe_mot'], ['groupes_mots', 'groupe'], ['mots', 'mot'], ['rubriques', 'rubrique'], [
100
-			'syndic',
101
-			'syndic',
102
-		], ['syndic', 'site'], ['syndic_articles', 'syndic_article'], ['types_documents', 'type_document']];
103
-	}
26
+    public static function providerConnectSqlTableObjet(): array {
27
+        return [[
28
+            0 => 'articles',
29
+            1 => 'articles',
30
+        ], [
31
+            0 => 'articles',
32
+            1 => 'article',
33
+        ], [
34
+            0 => 'articles',
35
+            1 => 'spip_articles',
36
+        ], [
37
+            0 => 'articles',
38
+            1 => 'id_article',
39
+        ], [
40
+            0 => 'rubriques',
41
+            1 => 'rubrique',
42
+        ], [
43
+            0 => 'rubriques',
44
+            1 => 'spip_rubriques',
45
+        ], [
46
+            0 => 'rubriques',
47
+            1 => 'id_rubrique',
48
+        ], [
49
+            0 => 'mots',
50
+            1 => 'mot',
51
+        ], [
52
+            0 => 'mots',
53
+            1 => 'spip_mots',
54
+        ], [
55
+            0 => 'mots',
56
+            1 => 'id_mot',
57
+        ], [
58
+            0 => 'groupes_mots',
59
+            1 => 'groupe_mots',
60
+        ], [
61
+            0 => 'groupes_mots',
62
+            1 => 'spip_groupes_mots',
63
+        ], [
64
+            0 => 'groupes_mots',
65
+            1 => 'id_groupe',
66
+        ], [
67
+            0 => 'groupes_mots',
68
+            1 => 'groupes_mot',
69
+        ], [
70
+            0 => 'syndic',
71
+            1 => 'syndic',
72
+        ], [
73
+            0 => 'syndic',
74
+            1 => 'site',
75
+        ], [
76
+            0 => 'syndic',
77
+            1 => 'spip_syndic',
78
+        ], [
79
+            0 => 'syndic',
80
+            1 => 'id_syndic',
81
+        ], [
82
+            0 => 'syndic_articles',
83
+            1 => 'syndic_article',
84
+        ], [
85
+            0 => 'syndic_articles',
86
+            1 => 'spip_syndic_articles',
87
+        ], [
88
+            0 => 'syndic_articles',
89
+            1 => 'id_syndic_article',
90
+        ], [
91
+            0 => 'syndic_articles',
92
+            1 => 'syndic_article',
93
+        ], ['articles', 'article'], ['auteurs', 'auteur'], ['documents', 'document'], ['documents', 'doc'], [
94
+            'documents',
95
+            'img',
96
+        ], ['documents', 'img'], ['forums', 'forum'], [
97
+            'groupes_mots',
98
+            'groupe_mots',
99
+        ], ['groupes_mots', 'groupe_mot'], ['groupes_mots', 'groupe'], ['mots', 'mot'], ['rubriques', 'rubrique'], [
100
+            'syndic',
101
+            'syndic',
102
+        ], ['syndic', 'site'], ['syndic_articles', 'syndic_article'], ['types_documents', 'type_document']];
103
+    }
104 104
 }
Please login to merge, or discard this patch.
ecrire/tests/Sql/Objets/TableObjetSqlTest.php 1 patch
Indentation   +89 added lines, -89 removed lines patch added patch discarded remove patch
@@ -13,95 +13,95 @@
 block discarded – undo
13 13
 
14 14
 class TableObjetSqlTest extends TestCase
15 15
 {
16
-	public static function setUpBeforeClass(): void {
17
-		find_in_path('base/connect_sql.php', '', true);
18
-	}
16
+    public static function setUpBeforeClass(): void {
17
+        find_in_path('base/connect_sql.php', '', true);
18
+    }
19 19
 
20
-	#[DataProvider('providerConnectSqlTableObjetSql')]
21
-	public function testConnectSqlTableObjetSql($expected, ...$args): void {
22
-		$actual = table_objet_sql(...$args);
23
-		$this->assertSame($expected, $actual);
24
-	}
20
+    #[DataProvider('providerConnectSqlTableObjetSql')]
21
+    public function testConnectSqlTableObjetSql($expected, ...$args): void {
22
+        $actual = table_objet_sql(...$args);
23
+        $this->assertSame($expected, $actual);
24
+    }
25 25
 
26
-	public static function providerConnectSqlTableObjetSql(): array {
27
-		return [[
28
-			0 => 'spip_articles',
29
-			1 => 'articles',
30
-		], [
31
-			0 => 'spip_articles',
32
-			1 => 'article',
33
-		], [
34
-			0 => 'spip_articles',
35
-			1 => 'spip_articles',
36
-		], [
37
-			0 => 'spip_articles',
38
-			1 => 'id_article',
39
-		], [
40
-			0 => 'spip_rubriques',
41
-			1 => 'rubrique',
42
-		], [
43
-			0 => 'spip_rubriques',
44
-			1 => 'spip_rubriques',
45
-		], [
46
-			0 => 'spip_rubriques',
47
-			1 => 'id_rubrique',
48
-		], [
49
-			0 => 'spip_mots',
50
-			1 => 'mot',
51
-		], [
52
-			0 => 'spip_mots',
53
-			1 => 'spip_mots',
54
-		], [
55
-			0 => 'spip_mots',
56
-			1 => 'id_mot',
57
-		], [
58
-			0 => 'spip_groupes_mots',
59
-			1 => 'groupe_mots',
60
-		], [
61
-			0 => 'spip_groupes_mots',
62
-			1 => 'spip_groupes_mots',
63
-		], [
64
-			0 => 'spip_groupes_mots',
65
-			1 => 'id_groupe',
66
-		], [
67
-			0 => 'spip_groupes_mots',
68
-			1 => 'groupes_mot',
69
-		], [
70
-			0 => 'spip_syndic',
71
-			1 => 'syndic',
72
-		], [
73
-			0 => 'spip_syndic',
74
-			1 => 'site',
75
-		], [
76
-			0 => 'spip_syndic',
77
-			1 => 'spip_syndic',
78
-		], [
79
-			0 => 'spip_syndic',
80
-			1 => 'id_syndic',
81
-		], [
82
-			0 => 'spip_syndic_articles',
83
-			1 => 'syndic_article',
84
-		], [
85
-			0 => 'spip_syndic_articles',
86
-			1 => 'spip_syndic_articles',
87
-		], [
88
-			0 => 'spip_syndic_articles',
89
-			1 => 'id_syndic_article',
90
-		], [
91
-			0 => 'spip_syndic_articles',
92
-			1 => 'syndic_article',
93
-		], ['spip_articles', 'article'], ['spip_auteurs', 'auteur'], ['spip_documents', 'document'], [
94
-			'spip_documents',
95
-			'doc',
96
-		], ['spip_documents', 'img'], ['spip_documents', 'img'], ['spip_forum', 'forum'], [
97
-			'spip_groupes_mots',
98
-			'groupes_mots',
99
-		], ['spip_groupes_mots', 'groupe_mots'], ['spip_groupes_mots', 'groupe_mot'], [
100
-			'spip_groupes_mots',
101
-			'groupe',
102
-		], ['spip_mots', 'mot'], ['spip_rubriques', 'rubrique'], ['spip_syndic', 'syndic'], [
103
-			'spip_syndic',
104
-			'site',
105
-		], ['spip_syndic_articles', 'syndic_article'], ['spip_types_documents', 'type_document']];
106
-	}
26
+    public static function providerConnectSqlTableObjetSql(): array {
27
+        return [[
28
+            0 => 'spip_articles',
29
+            1 => 'articles',
30
+        ], [
31
+            0 => 'spip_articles',
32
+            1 => 'article',
33
+        ], [
34
+            0 => 'spip_articles',
35
+            1 => 'spip_articles',
36
+        ], [
37
+            0 => 'spip_articles',
38
+            1 => 'id_article',
39
+        ], [
40
+            0 => 'spip_rubriques',
41
+            1 => 'rubrique',
42
+        ], [
43
+            0 => 'spip_rubriques',
44
+            1 => 'spip_rubriques',
45
+        ], [
46
+            0 => 'spip_rubriques',
47
+            1 => 'id_rubrique',
48
+        ], [
49
+            0 => 'spip_mots',
50
+            1 => 'mot',
51
+        ], [
52
+            0 => 'spip_mots',
53
+            1 => 'spip_mots',
54
+        ], [
55
+            0 => 'spip_mots',
56
+            1 => 'id_mot',
57
+        ], [
58
+            0 => 'spip_groupes_mots',
59
+            1 => 'groupe_mots',
60
+        ], [
61
+            0 => 'spip_groupes_mots',
62
+            1 => 'spip_groupes_mots',
63
+        ], [
64
+            0 => 'spip_groupes_mots',
65
+            1 => 'id_groupe',
66
+        ], [
67
+            0 => 'spip_groupes_mots',
68
+            1 => 'groupes_mot',
69
+        ], [
70
+            0 => 'spip_syndic',
71
+            1 => 'syndic',
72
+        ], [
73
+            0 => 'spip_syndic',
74
+            1 => 'site',
75
+        ], [
76
+            0 => 'spip_syndic',
77
+            1 => 'spip_syndic',
78
+        ], [
79
+            0 => 'spip_syndic',
80
+            1 => 'id_syndic',
81
+        ], [
82
+            0 => 'spip_syndic_articles',
83
+            1 => 'syndic_article',
84
+        ], [
85
+            0 => 'spip_syndic_articles',
86
+            1 => 'spip_syndic_articles',
87
+        ], [
88
+            0 => 'spip_syndic_articles',
89
+            1 => 'id_syndic_article',
90
+        ], [
91
+            0 => 'spip_syndic_articles',
92
+            1 => 'syndic_article',
93
+        ], ['spip_articles', 'article'], ['spip_auteurs', 'auteur'], ['spip_documents', 'document'], [
94
+            'spip_documents',
95
+            'doc',
96
+        ], ['spip_documents', 'img'], ['spip_documents', 'img'], ['spip_forum', 'forum'], [
97
+            'spip_groupes_mots',
98
+            'groupes_mots',
99
+        ], ['spip_groupes_mots', 'groupe_mots'], ['spip_groupes_mots', 'groupe_mot'], [
100
+            'spip_groupes_mots',
101
+            'groupe',
102
+        ], ['spip_mots', 'mot'], ['spip_rubriques', 'rubrique'], ['spip_syndic', 'syndic'], [
103
+            'spip_syndic',
104
+            'site',
105
+        ], ['spip_syndic_articles', 'syndic_article'], ['spip_types_documents', 'type_document']];
106
+    }
107 107
 }
Please login to merge, or discard this patch.
ecrire/tests/Sql/Objets/IdTableObjetTest.php 1 patch
Indentation   +86 added lines, -86 removed lines patch added patch discarded remove patch
@@ -13,92 +13,92 @@
 block discarded – undo
13 13
 
14 14
 class IdTableObjetTest extends TestCase
15 15
 {
16
-	public static function setUpBeforeClass(): void {
17
-		find_in_path('base/connect_sql.php', '', true);
18
-	}
16
+    public static function setUpBeforeClass(): void {
17
+        find_in_path('base/connect_sql.php', '', true);
18
+    }
19 19
 
20
-	#[DataProvider('providerConnectSqlIdTableObjet')]
21
-	public function testConnectSqlIdTableObjet($expected, ...$args): void {
22
-		$actual = id_table_objet(...$args);
23
-		$this->assertSame($expected, $actual);
24
-	}
20
+    #[DataProvider('providerConnectSqlIdTableObjet')]
21
+    public function testConnectSqlIdTableObjet($expected, ...$args): void {
22
+        $actual = id_table_objet(...$args);
23
+        $this->assertSame($expected, $actual);
24
+    }
25 25
 
26
-	public static function providerConnectSqlIdTableObjet(): array {
27
-		return [[
28
-			0 => 'id_article',
29
-			1 => 'articles',
30
-		], [
31
-			0 => 'id_article',
32
-			1 => 'article',
33
-		], [
34
-			0 => 'id_article',
35
-			1 => 'spip_articles',
36
-		], [
37
-			0 => 'id_article',
38
-			1 => 'id_article',
39
-		], [
40
-			0 => 'id_rubrique',
41
-			1 => 'rubriques',
42
-		], [
43
-			0 => 'id_rubrique',
44
-			1 => 'spip_rubriques',
45
-		], [
46
-			0 => 'id_rubrique',
47
-			1 => 'id_rubrique',
48
-		], [
49
-			0 => 'id_mot',
50
-			1 => 'mots',
51
-		], [
52
-			0 => 'id_mot',
53
-			1 => 'spip_mots',
54
-		], [
55
-			0 => 'id_mot',
56
-			1 => 'id_mot',
57
-		], [
58
-			0 => 'id_groupe',
59
-			1 => 'groupes_mots',
60
-		], [
61
-			0 => 'id_groupe',
62
-			1 => 'spip_groupes_mots',
63
-		], [
64
-			0 => 'id_groupe',
65
-			1 => 'id_groupe',
66
-		], [
67
-			0 => 'id_groupe',
68
-			1 => 'groupes_mot',
69
-		], [
70
-			0 => 'id_syndic',
71
-			1 => 'syndic',
72
-		], [
73
-			0 => 'id_syndic',
74
-			1 => 'site',
75
-		], [
76
-			0 => 'id_syndic',
77
-			1 => 'spip_syndic',
78
-		], [
79
-			0 => 'id_syndic',
80
-			1 => 'id_syndic',
81
-		], [
82
-			0 => 'id_syndic_article',
83
-			1 => 'syndic_articles',
84
-		], [
85
-			0 => 'id_syndic_article',
86
-			1 => 'spip_syndic_articles',
87
-		], [
88
-			0 => 'id_syndic_article',
89
-			1 => 'id_syndic_article',
90
-		], [
91
-			0 => 'id_syndic_article',
92
-			1 => 'syndic_article',
93
-		], ['id_article', 'article'], ['id_auteur', 'auteur'], ['id_document', 'document'], ['id_document', 'doc'], [
94
-			'id_document',
95
-			'img',
96
-		], ['id_document', 'img'], ['id_forum', 'forum'], ['id_groupe', 'groupe_mots'], [
97
-			'id_groupe',
98
-			'groupe_mot',
99
-		], ['id_groupe', 'groupes_mots'], ['id_groupe', 'groupe'], ['id_mot', 'mot'], ['id_rubrique', 'rubrique'], [
100
-			'id_syndic',
101
-			'syndic',
102
-		], ['id_syndic', 'site'], ['id_syndic_article', 'syndic_article'], ['extension', 'type_document']];
103
-	}
26
+    public static function providerConnectSqlIdTableObjet(): array {
27
+        return [[
28
+            0 => 'id_article',
29
+            1 => 'articles',
30
+        ], [
31
+            0 => 'id_article',
32
+            1 => 'article',
33
+        ], [
34
+            0 => 'id_article',
35
+            1 => 'spip_articles',
36
+        ], [
37
+            0 => 'id_article',
38
+            1 => 'id_article',
39
+        ], [
40
+            0 => 'id_rubrique',
41
+            1 => 'rubriques',
42
+        ], [
43
+            0 => 'id_rubrique',
44
+            1 => 'spip_rubriques',
45
+        ], [
46
+            0 => 'id_rubrique',
47
+            1 => 'id_rubrique',
48
+        ], [
49
+            0 => 'id_mot',
50
+            1 => 'mots',
51
+        ], [
52
+            0 => 'id_mot',
53
+            1 => 'spip_mots',
54
+        ], [
55
+            0 => 'id_mot',
56
+            1 => 'id_mot',
57
+        ], [
58
+            0 => 'id_groupe',
59
+            1 => 'groupes_mots',
60
+        ], [
61
+            0 => 'id_groupe',
62
+            1 => 'spip_groupes_mots',
63
+        ], [
64
+            0 => 'id_groupe',
65
+            1 => 'id_groupe',
66
+        ], [
67
+            0 => 'id_groupe',
68
+            1 => 'groupes_mot',
69
+        ], [
70
+            0 => 'id_syndic',
71
+            1 => 'syndic',
72
+        ], [
73
+            0 => 'id_syndic',
74
+            1 => 'site',
75
+        ], [
76
+            0 => 'id_syndic',
77
+            1 => 'spip_syndic',
78
+        ], [
79
+            0 => 'id_syndic',
80
+            1 => 'id_syndic',
81
+        ], [
82
+            0 => 'id_syndic_article',
83
+            1 => 'syndic_articles',
84
+        ], [
85
+            0 => 'id_syndic_article',
86
+            1 => 'spip_syndic_articles',
87
+        ], [
88
+            0 => 'id_syndic_article',
89
+            1 => 'id_syndic_article',
90
+        ], [
91
+            0 => 'id_syndic_article',
92
+            1 => 'syndic_article',
93
+        ], ['id_article', 'article'], ['id_auteur', 'auteur'], ['id_document', 'document'], ['id_document', 'doc'], [
94
+            'id_document',
95
+            'img',
96
+        ], ['id_document', 'img'], ['id_forum', 'forum'], ['id_groupe', 'groupe_mots'], [
97
+            'id_groupe',
98
+            'groupe_mot',
99
+        ], ['id_groupe', 'groupes_mots'], ['id_groupe', 'groupe'], ['id_mot', 'mot'], ['id_rubrique', 'rubrique'], [
100
+            'id_syndic',
101
+            'syndic',
102
+        ], ['id_syndic', 'site'], ['id_syndic_article', 'syndic_article'], ['extension', 'type_document']];
103
+    }
104 104
 }
Please login to merge, or discard this patch.