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 <mblaes...@doppel-helix.eu>
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: commits-unsubscr...@netbeans.apache.org
For additional commands, e-mail: commits-h...@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists

Reply via email to