This is an automated email from the ASF dual-hosted git repository.
matthiasblaesing pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans-tools.git
The following commit(s) were added to refs/heads/master by this push:
new 1e49bb6 Implement apache oauth login
new 6a3a7ba Merge pull request #42 from matthiasblaesing/pp3-login-apache
1e49bb6 is described below
commit 1e49bb68f2335579e70d8ac5a189c65bf3ef9631
Author: Matthias Bläsing <[email protected]>
AuthorDate: Wed Feb 3 21:39:46 2021 +0100
Implement apache oauth login
The ASF provides an oauth based login option via:
https://oauth.apache.org
see
https://oauth.apache.org/api.html
for documentation. This change integrates the oauth system and allows
every ASF committer to login using his/her ASF credentials.
---
.../Application/config/module.config.php.dist | 8 +
.../src/Application/Controller/LoginController.php | 88 +++--
pp3/public/img/login/apache.svg | 404 +++++++++++++++++++++
3 files changed, 467 insertions(+), 33 deletions(-)
diff --git a/pp3/module/Application/config/module.config.php.dist
b/pp3/module/Application/config/module.config.php.dist
index 5dafbfb..32f514b 100755
--- a/pp3/module/Application/config/module.config.php.dist
+++ b/pp3/module/Application/config/module.config.php.dist
@@ -60,6 +60,14 @@ return array(
'clientId' => 'DO_NOT_COMMIT',
'clientSecret' => 'DO_NOT_COMMIT',
'type' => 'amazon'
+ ),
+ array(
+ 'id' => 'apache',
+ 'name' => 'Apache',
+ 'icon' => '/img/login/apache.svg',
+ 'clientId' => 'IGNORED',
+ 'clientSecret' => 'IGNORED',
+ 'type' => 'apache'
)
),
'router' => array(
diff --git
a/pp3/module/Application/src/Application/Controller/LoginController.php
b/pp3/module/Application/src/Application/Controller/LoginController.php
index 3fbdfeb..493897d 100644
--- a/pp3/module/Application/src/Application/Controller/LoginController.php
+++ b/pp3/module/Application/src/Application/Controller/LoginController.php
@@ -82,6 +82,9 @@ class LoginController extends BaseController {
$stateBytes = random_bytes(64);
$state = bin2hex($stateBytes);
+ if($loginConfig['type'] == 'apache') {
+ $state = substr($state, 0, 64);
+ }
$_SESSION['oauthState'] = $state;
$_SESSION['oauthConfig'] = $loginConfig['id'];
$scopeData = self::scopesFromType($loginConfig['type']);
@@ -89,7 +92,7 @@ class LoginController extends BaseController {
'client_id' => $loginConfig['clientId'],
'state' => $state,
'response_type' => 'code',
- 'redirect_uri' => $this->redirectUrl()
+ 'redirect_uri' => $this->redirectUrl($loginConfig['type'], $state)
);
if($scopeData) {
$queryData['scope'] = $scopeData;
@@ -124,39 +127,48 @@ class LoginController extends BaseController {
return $response;
}
- $tokenRequest = self::tokenRequest($code, $loginConfig);
- $queryTokenResult =
file_get_contents(self::tokenUrlFromType($loginConfig['type']), false,
stream_context_create([
- 'http' => [
- 'method' => 'POST',
- 'header' => ["Content-type: application/json", "Accept:
application/json"],
- 'content' => json_encode($tokenRequest)
- ]
- ]));
-
- if(!$queryTokenResult) {
- error_log("Empty response");
- $response->setStatusCode(500);
- $response->setContent(json_encode(array('success' => false,
'reason' => 'INVALID_TOKEN')));
- return $response;
- }
+ if($loginConfig['type'] == 'apache') {
+ $queryProfileResult =
file_get_contents("https://oauth.apache.org/token?code=" . $_GET['code'],
false, stream_context_create([
+ 'http' => [
+ 'header' => ['Accept: application/json', 'User-Agent:
Netbeans Plugin Portal'],
+ "ignore_errors" => true,
+ ]
+ ]));
+ } else {
+ $tokenRequest = self::tokenRequest($code, $loginConfig);
+ $queryTokenResult =
file_get_contents(self::tokenUrlFromType($loginConfig['type']), false,
stream_context_create([
+ 'http' => [
+ 'method' => 'POST',
+ 'header' => ["Content-type: application/json", "Accept:
application/json"],
+ 'content' => json_encode($tokenRequest)
+ ]
+ ]));
+
+ if(!$queryTokenResult) {
+ error_log("Empty response");
+ $response->setStatusCode(500);
+ $response->setContent(json_encode(array('success' => false,
'reason' => 'INVALID_TOKEN')));
+ return $response;
+ }
- $tokenData = json_decode($queryTokenResult, true);
+ $tokenData = json_decode($queryTokenResult, true);
- if((! $tokenData) || (! $tokenData['access_token']) ||
(strtolower($tokenData['token_type']) != 'bearer')) {
- error_log("Failed to decode token data: " . $queryTokenResult);
- $response->setStatusCode(500);
- $response->setContent(json_encode(array('success' => false,
'reason' => 'INVALID_TOKEN')));
- return $response;
- }
+ if((! $tokenData) || (! $tokenData['access_token']) ||
(strtolower($tokenData['token_type']) != 'bearer')) {
+ error_log("Failed to decode token data: " . $queryTokenResult);
+ $response->setStatusCode(500);
+ $response->setContent(json_encode(array('success' => false,
'reason' => 'INVALID_TOKEN')));
+ return $response;
+ }
- $queryProfileResult =
file_get_contents(self::profileUrlFromType($loginConfig['type']), false,
stream_context_create([
- 'http' => [
- 'header' => ['Accept: application/json', 'Authorization:
Bearer ' . $tokenData['access_token'], 'User-Agent: Netbeans Plugin Portal'],
- "ignore_errors" => true,
- ]
- ]));
+ $queryProfileResult =
file_get_contents(self::profileUrlFromType($loginConfig['type']), false,
stream_context_create([
+ 'http' => [
+ 'header' => ['Accept: application/json', 'Authorization:
Bearer ' . $tokenData['access_token'], 'User-Agent: Netbeans Plugin Portal'],
+ "ignore_errors" => true,
+ ]
+ ]));
+ }
- $userinfo = $this->extractUserInfo($loginConfig['type'],
$loginConfig['id'], $queryProfileResult);
+ $userinfo = $this->extractUserInfo($loginConfig['type'],
$loginConfig['id'], $queryProfileResult, $_SESSION['oauthState']);
if($userinfo == null) {
error_log("Failed to parse: " . $queryProfileResult);
@@ -212,8 +224,13 @@ class LoginController extends BaseController {
return $this->redirect()->toRoute("home");
}
- private function redirectUrl() {
- return $this->url()->fromRoute("login", array("action" => "callback"),
array('force_canonical'=>true));
+ private function redirectUrl($type = '', $state = '') {
+ $url = $this->url()->fromRoute("login", array("action" => "callback"),
array('force_canonical' => true));
+ if ($type == 'apache') {
+ return $url . "?state=$state";
+ } else {
+ return $url;
+ }
}
public function logoutAction() {
@@ -232,6 +249,7 @@ class LoginController extends BaseController {
case 'github': return 'https://github.com/login/oauth/authorize';
case 'google': return
'https://accounts.google.com/o/oauth2/v2/auth';
case 'amazon': return 'https://www.amazon.com/ap/oa';
+ case 'apache': return 'https://oauth.apache.org/auth';
}
}
@@ -275,7 +293,7 @@ class LoginController extends BaseController {
return $data;
}
- private function extractUserInfo($type, $providerId, $data) {
+ private function extractUserInfo($type, $providerId, $data, $state = '') {
if(! $data) {
return null;
}
@@ -297,6 +315,10 @@ class LoginController extends BaseController {
$userinfo['id'] = "" . $json['user_id'];
$userinfo['email'] = "" . $json['email'];
$userinfo['name'] = "" . $json['name'];
+ } else if ($type == 'apache' && $json['state'] == $state) {
+ $userinfo['id'] = "" . $json['uid'];
+ $userinfo['email'] = "" . $json['email'];
+ $userinfo['name'] = "" . $json['fullname'];
}
return $userinfo;
}
diff --git a/pp3/public/img/login/apache.svg b/pp3/public/img/login/apache.svg
new file mode 100644
index 0000000..6752b34
--- /dev/null
+++ b/pp3/public/img/login/apache.svg
@@ -0,0 +1,404 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Feather"
+ x="0px"
+ y="0px"
+ viewBox="0 0 24 23.999999"
+ enable-background="new 0 0 2392.5 4226.6"
+ xml:space="preserve"
+ sodipodi:docname="apache.svg"
+ width="24"
+ height="24"
+ inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"><metadata
+ id="metadata2733"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage"
/><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs2731" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1842"
+ inkscape:window-height="1133"
+ id="namedview2729"
+ showgrid="false"
+ inkscape:zoom="23.655936"
+ inkscape:cx="13.404414"
+ inkscape:cy="15.139504"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="Feather" />
+<linearGradient
+ id="SVGID_1_"
+ gradientUnits="userSpaceOnUse"
+ x1="-5167.0962"
+ y1="697.55487"
+ x2="-4570.1162"
+ y2="1395.619"
+
gradientTransform="matrix(0.4226,-0.9063,0.9063,0.4226,3144.8108,-4619.2983)">
+ <stop
+ offset="0"
+ style="stop-color:#F69923"
+ id="stop2590" />
+ <stop
+ offset="0.3123"
+ style="stop-color:#F79A23"
+ id="stop2592" />
+ <stop
+ offset="0.8383"
+ style="stop-color:#E97826"
+ id="stop2594" />
+</linearGradient>
+
+
+
+
+
+
+
+
+
+<linearGradient
+ id="SVGID_2_"
+ gradientUnits="userSpaceOnUse"
+ x1="-9585.3418"
+ y1="620.50482"
+ x2="-5326.209"
+ y2="620.50482"
+
gradientTransform="matrix(0.4226,-0.9063,0.9063,0.4226,3144.8108,-4619.2983)">
+ <stop
+ offset="0.3233"
+ style="stop-color:#9E2064"
+ id="stop2615" />
+ <stop
+ offset="0.6302"
+ style="stop-color:#C92037"
+ id="stop2617" />
+ <stop
+ offset="0.7514"
+ style="stop-color:#666666;stop-opacity:1"
+ id="stop2619" />
+ <stop
+ offset="1"
+ style="stop-color:#b3b3b3;stop-opacity:1"
+ id="stop2621" />
+</linearGradient>
+
+<linearGradient
+ id="SVGID_3_"
+ gradientUnits="userSpaceOnUse"
+ x1="-9071.207"
+ y1="1047.6898"
+ x2="-6533.1782"
+ y2="1047.6898"
+
gradientTransform="matrix(0.4226,-0.9063,0.9063,0.4226,3144.8108,-4619.2983)">
+ <stop
+ offset="0"
+ style="stop-color:#282662"
+ id="stop2626" />
+ <stop
+ offset="9.548390e-02"
+ style="stop-color:#662E8D"
+ id="stop2628" />
+ <stop
+ offset="0.7882"
+ style="stop-color:#9F2064"
+ id="stop2630" />
+ <stop
+ offset="0.9487"
+ style="stop-color:#CD2032"
+ id="stop2632" />
+</linearGradient>
+
+<linearGradient
+ id="SVGID_4_"
+ gradientUnits="userSpaceOnUse"
+ x1="-9346.126"
+ y1="580.81702"
+ x2="-5086.9941"
+ y2="580.81702"
+
gradientTransform="matrix(0.4226,-0.9063,0.9063,0.4226,3144.8108,-4619.2983)">
+ <stop
+ offset="0.3233"
+ style="stop-color:#333333;stop-opacity:1"
+ id="stop2637" />
+ <stop
+ offset="0.6302"
+ style="stop-color:#666666;stop-opacity:1"
+ id="stop2639" />
+ <stop
+ offset="0.7514"
+ style="stop-color:#808080;stop-opacity:1"
+ id="stop2641" />
+ <stop
+ offset="1"
+ style="stop-color:#b3b3b3;stop-opacity:1"
+ id="stop2643" />
+</linearGradient>
+
+<linearGradient
+ id="SVGID_5_"
+ gradientUnits="userSpaceOnUse"
+ x1="-9035.5029"
+ y1="638.4408"
+ x2="-6797.2012"
+ y2="638.4408"
+
gradientTransform="matrix(0.4226,-0.9063,0.9063,0.4226,3144.8108,-4619.2983)">
+ <stop
+ offset="0"
+ style="stop-color:#282662"
+ id="stop2648" />
+ <stop
+ offset="9.548390e-02"
+ style="stop-color:#662E8D"
+ id="stop2650" />
+ <stop
+ offset="0.7882"
+ style="stop-color:#9F2064"
+ id="stop2652" />
+ <stop
+ offset="0.9487"
+ style="stop-color:#CD2032"
+ id="stop2654" />
+</linearGradient>
+
+<linearGradient
+ id="SVGID_6_"
+ gradientUnits="userSpaceOnUse"
+ x1="-9346.126"
+ y1="1021.6218"
+ x2="-5086.9941"
+ y2="1021.6218"
+
gradientTransform="matrix(0.4226,-0.9063,0.9063,0.4226,3144.8108,-4619.2983)">
+ <stop
+ offset="0.3233"
+ style="stop-color:#333333;stop-opacity:1"
+ id="stop2659" />
+ <stop
+ offset="0.6302"
+ style="stop-color:#666666;stop-opacity:1"
+ id="stop2661" />
+ <stop
+ offset="0.7514"
+ style="stop-color:#999999;stop-opacity:1"
+ id="stop2663" />
+ <stop
+ offset="1"
+ style="stop-color:#b3b3b3;stop-opacity:1"
+ id="stop2665" />
+</linearGradient>
+
+<linearGradient
+ id="SVGID_7_"
+ gradientUnits="userSpaceOnUse"
+ x1="-9610.334"
+ y1="999.73297"
+ x2="-5351.2017"
+ y2="999.73297"
+
gradientTransform="matrix(0.4226,-0.9063,0.9063,0.4226,3144.8108,-4619.2983)">
+ <stop
+ offset="0.3233"
+ style="stop-color:#9E2064"
+ id="stop2670" />
+ <stop
+ offset="0.6302"
+ style="stop-color:#C92037"
+ id="stop2672" />
+ <stop
+ offset="0.7514"
+ style="stop-color:#666666;stop-opacity:1"
+ id="stop2674" />
+ <stop
+ offset="1"
+ style="stop-color:#b3b3b3;stop-opacity:1"
+ id="stop2676" />
+</linearGradient>
+
+
+
+<linearGradient
+ id="SVGID_8_"
+ gradientUnits="userSpaceOnUse"
+ x1="-9346.126"
+ y1="1152.7261"
+ x2="-5086.9941"
+ y2="1152.7261"
+
gradientTransform="matrix(0.4226,-0.9063,0.9063,0.4226,3144.8108,-4619.2983)">
+ <stop
+ offset="0.3233"
+ style="stop-color:#9E2064"
+ id="stop2685" />
+ <stop
+ offset="0.6302"
+ style="stop-color:#C92037"
+ id="stop2687" />
+ <stop
+ offset="0.7514"
+ style="stop-color:#CD2335"
+ id="stop2689" />
+ <stop
+ offset="1"
+ style="stop-color:#E97826"
+ id="stop2691" />
+</linearGradient>
+
+
+
+<linearGradient
+ id="SVGID_9_"
+ gradientUnits="userSpaceOnUse"
+ x1="-9346.126"
+ y1="1137.7247"
+ x2="-5086.9941"
+ y2="1137.7247"
+
gradientTransform="matrix(0.4226,-0.9063,0.9063,0.4226,3144.8108,-4619.2983)">
+ <stop
+ offset="0.3233"
+ style="stop-color:#9E2064"
+ id="stop2700" />
+ <stop
+ offset="0.6302"
+ style="stop-color:#C92037"
+ id="stop2702" />
+ <stop
+ offset="0.7514"
+ style="stop-color:#CD2335"
+ id="stop2704" />
+ <stop
+ offset="1"
+ style="stop-color:#E97826"
+ id="stop2706" />
+</linearGradient>
+
+
+
+<linearGradient
+ id="SVGID_10_"
+ gradientUnits="userSpaceOnUse"
+ x1="-6953.4072"
+ y1="1134.7161"
+ x2="-6011.9995"
+ y2="1134.7161"
+
gradientTransform="matrix(0.4226,-0.9063,0.9063,0.4226,3144.8108,-4619.2983)">
+ <stop
+ offset="0.3233"
+ style="stop-color:#9E2064"
+ id="stop2715" />
+ <stop
+ offset="0.6302"
+ style="stop-color:#C92037"
+ id="stop2717" />
+ <stop
+ offset="0.7514"
+ style="stop-color:#CD2335"
+ id="stop2719" />
+ <stop
+ offset="1"
+ style="stop-color:#E97826"
+ id="stop2721" />
+</linearGradient>
+<g
+ id="g2759"
+
transform="matrix(0.00637392,0.00170789,-0.00170789,0.00637392,8.20675,-3.0354689)"><path
+ fill="url(#SVGID_1_)"
+ d="M 1798.9,20.1 C 1732.6,59.2 1622.5,170 1491,330.5 l 120.8,228 c
84.8,-121.3 170.9,-230.4 257.8,-323.6 6.7,-7.4 10.2,-10.9 10.2,-10.9 -3.4,3.6
-6.8,7.3 -10.2,10.9 -28.1,31 -113.4,130.5 -242.1,328.1 123.9,-6.2 314.3,-31.5
469.6,-58.1 46.2,-258.8 -45.3,-377.3 -45.3,-377.3 0,0 -116.3,-188.2
-252.9,-107.5 z"
+ id="path2597"
+ style="fill:#b3b3b3" /><path
+ fill="none"
+ d="m 1594.4,1320.7 c 0.9,-0.2 1.8,-0.3 2.7,-0.5 l -17.4,1.9 c -1.1,0.5
-2,1 -3.1,1.4 6,-0.9 11.9,-1.9 17.8,-2.8 z"
+ id="path2599" /><path
+ fill="none"
+ d="m 1471.1,1729.1 c -9.9,2.2 -20,3.9 -30.2,5.4 10.2,-1.5 20.3,-3.3
30.2,-5.4 z"
+ id="path2601" /><path
+ fill="none"
+ d="m 633.1,2645.2 c 1.3,-3.4 2.6,-6.8 3.8,-10.2 26.6,-70.2 52.9,-138.4
79,-204.9 29.3,-74.6 58.2,-146.8 86.8,-216.8 30.1,-73.8 59.8,-145.1 89.1,-214
30.7,-72.3 61,-141.9 90.7,-208.9 24.2,-54.5 48,-107.3 71.5,-158.4 7.8,-17
15.6,-33.9 23.4,-50.6 15.4,-33.1 30.7,-65.6 45.7,-97.3 13.9,-29.3 27.7,-57.9
41.4,-86 4.5,-9.4 9.1,-18.6 13.6,-27.9 0.7,-1.5 1.5,-3 2.2,-4.5 l -14.8,1.6
-11.8,-23.2 c -1.1,2.3 -2.3,4.5 -3.5,6.8 -21.2,42.1 -42.2,84.6 -63,127.5
-12,24.8 -24,49.7 -35.9,74.7 -33,69.3 [...]
+ id="path2603" /><path
+ fill="none"
+ d="m 1433.2,1735.7 v 0 c 0.1,0 0.1,-0.1 0.2,-0.1 0,0 -0.1,0 -0.2,0.1 z"
+ id="path2605" /><path
+ fill="#be202e"
+ d="m 1393.2,1934.8 c -15.4,2.8 -31.3,5.5 -47.6,8.3 -0.1,0 -0.2,0.1
-0.3,0.1 8.2,-1.2 16.3,-2.4 24.3,-3.8 8,-1.4 15.8,-2.9 23.6,-4.6 z"
+ id="path2607" /><path
+ opacity="0.35"
+ fill="#be202e"
+ d="m 1393.2,1934.8 c -15.4,2.8 -31.3,5.5 -47.6,8.3 -0.1,0 -0.2,0.1
-0.3,0.1 8.2,-1.2 16.3,-2.4 24.3,-3.8 8,-1.4 15.8,-2.9 23.6,-4.6 z"
+ id="path2609" /><path
+ fill="#be202e"
+ d="m 1433.6,1735.5 c 0,0 -0.1,0 -0.1,0.1 -0.1,0 -0.1,0.1 -0.2,0.1
2.6,-0.3 5.1,-0.8 7.6,-1.1 10.3,-1.5 20.4,-3.3 30.2,-5.4 -12.3,2 -24.8,4.2
-37.5,6.3 z"
+ id="path2611" /><path
+ opacity="0.35"
+ fill="#be202e"
+ d="m 1433.6,1735.5 c 0,0 -0.1,0 -0.1,0.1 -0.1,0 -0.1,0.1 -0.2,0.1
2.6,-0.3 5.1,-0.8 7.6,-1.1 10.3,-1.5 20.4,-3.3 30.2,-5.4 -12.3,2 -24.8,4.2
-37.5,6.3 z"
+ id="path2613" /><path
+ fill="url(#SVGID_2_)"
+ d="m 1255.7,1147.6 c 36.7,-68.6 73.9,-135.7 111.5,-201 39,-67.8
78.5,-133.6 118.4,-197 2.3,-3.7 4.7,-7.5 7,-11.3 39.4,-62.4 79.2,-122.4
119.3,-179.8 l -120.8,-228 c -9.1,11.1 -18.2,22.4 -27.5,33.9 -34.8,43.4
-71,90.1 -108.1,139.6 -41.8,55.8 -84.8,115.4 -128.5,177.9 -40.3,57.8
-81.2,118.3 -122.1,180.9 -34.8,53.3 -69.8,108.2 -104.5,164.5 -1.3,2.1 -2.6,4.2
-3.9,6.3 l 157.2,310.5 c 33.6,-66.5 67.6,-132.1 102,-196.5 z"
+ id="path2624"
+ style="fill:url(#SVGID_2_)" /><path
+ fill="url(#SVGID_3_)"
+ d="m 539.7,2897.1 c -20.8,57.2 -41.7,115.4 -62.7,174.9 -0.3,0.9 -0.6,1.7
-0.9,2.6 -3,8.4 -5.9,16.8 -8.9,25.2 -14.1,40.1 -26.4,76.2 -54.5,158.3 46.3,21.1
83.5,76.7 118.7,139.8 -3.7,-65.3 -30.8,-126.7 -82.1,-174.2 228.3,10.3 425,-47.4
526.7,-214.3 9.1,-14.9 17.4,-30.5 24.9,-47.2 -46.2,58.6 -103.5,83.5 -211.4,77.4
-0.2,0.1 -0.5,0.2 -0.7,0.3 0.2,-0.1 0.5,-0.2 0.7,-0.3 158.8,-71.1 238.5,-139.3
308.9,-252.4 16.7,-26.8 32.9,-56.1 49.5,-88.6 C 1009,2841.2 848.1,2881.8
678.6,2851 l -127.1,13 [...]
+ id="path2635"
+ style="fill:#333333" /><path
+ fill="url(#SVGID_4_)"
+ d="m 599,2612.4 c 27.5,-71 55.8,-142.8 84.8,-215.3 27.8,-69.4 56.4,-139.2
85.6,-209.4 29.2,-70.2 59.1,-140.5 89.6,-210.9 31,-71.6 62.7,-143.1 94.9,-214.2
31.9,-70.3 64.4,-140.3 97.4,-209.6 11.9,-25 23.9,-49.9 35.9,-74.7 20.8,-42.9
41.8,-85.4 63,-127.5 1.1,-2.3 2.3,-4.5 3.5,-6.8 L 996.5,1033.5 c -2.6,4.2
-5.1,8.4 -7.7,12.6 -36.6,59.8 -73.1,121 -108.9,183.5 -36.2,63.1 -71.7,127.4
-106.4,192.6 -29.3,55 -57.9,110.5 -85.7,166.5 -5.6,11.4 -11.1,22.6 -16.6,33.9
-34.3,70.5 -65.2,138.6 -93.2 [...]
+ id="path2646"
+ style="fill:url(#SVGID_4_)" /><path
+ fill="url(#SVGID_5_)"
+ d="m 356.1,2529.2 c -19.8,99.8 -33.9,199.2 -41,298 -0.2,3.5 -0.6,6.9
-0.8,10.4 -49.3,-79 -181.3,-156.1 -181,-155.4 94.5,137 166.2,273 176.9,406.5
-50.6,10.4 -119.9,-4.6 -200,-34.1 83.5,76.7 146.2,97.9 170.6,103.6 -76.7,4.8
-156.6,57.5 -237.1,118.2 117.7,-48 212.8,-67 280.9,-51.6 -108,305.8
-216.3,643.4 -324.6,1001.8 33.2,-9.8 53,-32.1 64.1,-62.3 19.3,-64.9
147.4,-490.7 348.1,-1050.4 5.7,-15.9 11.5,-31.9 17.3,-48 1.6,-4.5 3.3,-9
4.9,-13.4 21.2,-58.7 43.2,-118.6 65.9,-179.7 5.2,-13.9 [...]
+ id="path2657"
+ style="fill:#333333" /><path
+ fill="url(#SVGID_6_)"
+ d="m 1178.1,1370.3 c -4.5,9.2 -9,18.5 -13.6,27.9 -13.6,28.1 -27.4,56.7
-41.4,86 -15.1,31.7 -30.3,64.1 -45.7,97.3 -7.8,16.7 -15.5,33.5 -23.4,50.6
-23.5,51.1 -47.3,103.9 -71.5,158.4 -29.7,67 -60,136.6 -90.7,208.9 -29.3,68.9
-59,140.2 -89.1,214 -28.6,70 -57.5,142.3 -86.8,216.8 -26.1,66.5 -52.4,134.7
-79,204.9 -1.3,3.4 -2.6,6.8 -3.8,10.2 -26.4,69.7 -53,141.3 -79.8,214.7 -0.6,1.7
-1.2,3.4 -1.8,5 l 127.1,-13.9 c -2.5,-0.5 -5.1,-0.8 -7.6,-1.3 152,-18.9
354,-132.5 484.6,-272.7 60.2,-64.6 11 [...]
+ id="path2668"
+ style="fill:url(#SVGID_6_)" /><path
+ fill="url(#SVGID_7_)"
+ d="m 1627.6,563.1 c -35.5,54.5 -74.3,116.4 -116,186.5 -2.2,3.6 -4.4,7.4
-6.6,11.1 -36,60.7 -74.3,127.3 -114.5,200.3 -34.8,63 -71,130.6 -108.6,203.3
-32.8,63.3 -66.7,130.5 -101.5,201.6 l 399.3,-43.8 c 116.3,-53.5 168.3,-101.9
218.8,-171.9 13.4,-19.3 26.9,-39.5 40.3,-60.4 41,-64 81.2,-134.5 117.2,-204.6
34.7,-67.7 65.3,-134.8 88.8,-195.3 14.9,-38.5 26.9,-74.3 35.2,-105.7 7.3,-27.7
13,-54 17.4,-79.1 -155.5,26.5 -345.9,51.9 -469.8,58 z"
+ id="path2679"
+ style="fill:url(#SVGID_7_)" /><path
+ fill="#be202e"
+ d="m 1369.6,1939.4 c -8,1.4 -16.1,2.7 -24.3,3.8 v 0 c 8.2,-1.1 16.3,-2.4
24.3,-3.8 z"
+ id="path2681" /><path
+ opacity="0.35"
+ fill="#be202e"
+ d="m 1369.6,1939.4 c -8,1.4 -16.1,2.7 -24.3,3.8 v 0 c 8.2,-1.1 16.3,-2.4
24.3,-3.8 z"
+ id="path2683" /><path
+ fill="url(#SVGID_8_)"
+ d="m 1369.6,1939.4 c -8,1.4 -16.1,2.7 -24.3,3.8 v 0 c 8.2,-1.1 16.3,-2.4
24.3,-3.8 z"
+ id="path2694"
+ style="fill:url(#SVGID_8_)" /><path
+ fill="#be202e"
+ d="m 1433.2,1735.7 c 2.6,-0.3 5.1,-0.8 7.6,-1.1 -2.5,0.3 -5,0.7 -7.6,1.1
z"
+ id="path2696" /><path
+ opacity="0.35"
+ fill="#be202e"
+ d="m 1433.2,1735.7 c 2.6,-0.3 5.1,-0.8 7.6,-1.1 -2.5,0.3 -5,0.7 -7.6,1.1
z"
+ id="path2698" /><path
+ fill="url(#SVGID_9_)"
+ d="m 1433.2,1735.7 c 2.6,-0.3 5.1,-0.8 7.6,-1.1 -2.5,0.3 -5,0.7 -7.6,1.1
z"
+ id="path2709"
+ style="fill:url(#SVGID_9_)" /><path
+ fill="#be202e"
+ d="m 1433.5,1735.6 c 0,0 0.1,0 0.1,-0.1 v 0 0 0 c 0,0 -0.1,0 -0.1,0.1 z"
+ id="path2711" /><path
+ opacity="0.35"
+ fill="#be202e"
+ d="m 1433.5,1735.6 c 0,0 0.1,0 0.1,-0.1 v 0 0 0 c 0,0 -0.1,0 -0.1,0.1 z"
+ id="path2713" /><path
+ fill="url(#SVGID_10_)"
+ d="m 1433.5,1735.6 c 0,0 0.1,0 0.1,-0.1 v 0 0 0 c 0,0 -0.1,0 -0.1,0.1 z"
+ id="path2724"
+ style="fill:url(#SVGID_10_)" /></g>
+
+</svg>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists