Commit e015bdae authored by mbelhaj's avatar mbelhaj
Browse files

first commit

parent 9f0f1d46
//function between(x, min, max) {
// return x >= min && x <= max;
// }
\ No newline at end of file
// npm install express
const express = require('express')
const bodyParser = require('body-parser');
const cors = require('cors');
const fs = require('fs');
const axios= require('axios')
require('dotenv').config();
//const readdir = util.promisify(fs.readdir);
const app = express()
const port = 4000
//const MIN_MOUNTH = process.env.MIN_MOUNTH
//const MAX_MOUNTH = process.env.MAX_MOUNTH
//const utils = require('./function-tools.js');
var util = require('util');
const json = require('body-parser/lib/types/json');
//const exec2 = util.promisify(require('child_process').exec);
app.use(cors());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.post('/api/storeClientRequest', (req, res) => {
console.log(req.body)
const data = JSON.stringify(req.body);
// write JSON string to a file
fs.writeFile('./requests/toCreate/request'+req.body.client_id+'.json', data, 'utf8', (err) => {
if (err) {
throw err;
}
console.log("JSON data is saved.");
//console.log(file)
});
//array.push(file)
res.send('Client Request has been added to the storage');
});
const requests = [
{
"training_name":"nse2021",
"region":"europe-west1",
"count":1,
"start_month":5,
"end_month":5,
"start_day":2,
"end_day":4,
"start_hour":8,
"end_hour":6,
},
{
"training_name":"fortipoc",
"region":"europe-west1",
"count":1,
"start_month":5,
"end_month":5,
"":1,
"end_day":2,
"start_hour":8,
"end_hour":6,
}
];
app.post('/test', async(req, res) => {
console.log(req.body)
//var obj = req.body[i];
var today = new Date();
var hour = today.getHours();
var dd = String(today.getDate());
var mm = String(today.getMonth() + 1)
//var toStartDir = "./requests/toStart"
//console.log(process.env.MIN_MOUNTH)
//if (typeof req.body.start_month == "number" && Math.floor(req.body.start_month) >= process.env.MIN_MOUNTH && Math.floor(req.body.start_month) <= process.env.MAX_MOUNTH && Math.floor(req.body.start_month) <= Math.floor(req.body.end_month) ) {
//if (typeof req.body.end_month == "number" && Math.floor(req.body.end_month) >= process.env.MIN_MOUNTH && Math.floor(req.body.end_month) <= process.env.MAX_MOUNTH && Math.floor(req.body.end_month) >= Math.floor(req.body.end_month) ) {
//if (typeof req.body.start_day_of_week === "number" && typeof req.body.end_day_of_week === "number" && Math.floor(req.body.start_day_of_week) >= process.env.FIRST_DAY_OF_WEEK && Math.floor(req.body.start_day_of_week) <= process.env.LAST_DAY_OF_WEEK && Math.floor(req.body.end_day_of_week) >= process.env.FIRST_DAY_OF_WEEK && Math.floor(req.body.end_day_of_week) <= process.env.LAST_DAY_OF_WEEK ){
//if ( typeof req.body.start_day === "number" && Math.floor(req.body.start_day) >= process.env.FIRST_DAY && Math.floor(req.body.start_day) <= process.env.LAST_DAY) {
//if ( typeof req.body.end_day === "number" && Math.floor(req.body.end_day) >= process.env.FIRST_DAY && Math.floor(req.body.end_day) <= process.env.LAST_DAY) {
//if ( typeof req.body.start_hour === "number" && Math.floor(req.body.start_hour) >= process.env.FIRST_HOUR && Math.floor(req.body.start_hour) <= process.env.LAST_HOUR && Math.floor(req.body.start_hour) < Math.floor(req.body.end_hour)) {
//if ( typeof req.body.end_hour === "number" && Math.floor(req.body.end_hour) >= process.env.FIRST_HOUR && Math.floor(req.body.end_hour) <= process.env.LAST_HOUR && Math.floor(req.body.start_hour) < Math.floor(req.body.end_hour)) {
const dir = "./requests/toCreate"
const files = fs.readdirSync(dir)
for( const file of files ) {
const test = file;
console.log(test);
//const json = JSON.stringify(test);
//const obj = JSON.parse(json);
//console.log(obj.client_id);
fs.readFile(test, (err, data) => {
if(err) {
console.log("File reading failed", err)
return
}
console.log("File data:", data)
})
/*
const fs = require("fs")
const path = require("path")
const currentPath = path.join(__dirname, "test.json")
const newPath = path.join(__dirname, "requests/toDelete", "new-test.json")
fs.rename(currentPath, newPath, function(err) {
if (err) {
throw err
} else {
console.log("Successfully moved the file!")
}
}) */
}
/*
console.log(req.body.start_month);
if ( hour == (req.body.start_hour ) && dd === req.body.start_day && mm === req.body.start_month) {
console.log("In this section, we will create the gcp infra");
const order = await axios.post('http://localhost:3000/api/gcp/authenticate')
console.log(order.data)
let payload = {"training_name":req.body.training_name,
"region":req.body.region,
"count":req.body.count
};
console.log(payload)
let result = await axios.post('http://localhost:3000/api/gcp/create', payload);
let data = result.data;
console.log(data);
}
if ( hour == req.body.end_hour && dd == req.body.end_day && mm == req.body.end_month) {
console.log("In this section we will delete the gcp infra");
const order = await axios.post('http://localhost:3000/api/gcp/authenticate')
console.log(order.data)
let payload = {"training_name":req.body.training_name};
console.log(payload)
let output = await axios.post('http://localhost:3000/api/gcp/delete', payload);
let data = output.data;
console.log(data);
}
*/
//}
//else {res.send(" Invalid number for END_HOUR : allowed range [ "+process.env.FIRST_HOUR+" - "+process.env.LAST_HOUR+" ] ") }
//}
//else {res.send(" Invalid number for START_HOUR : allowed range [ "+process.env.FIRST_HOUR+" - "+process.env.LAST_HOUR+" ] ") }
//}
//else { res.send(" Invalid number for END_DAY : allowed range [ "+process.env.FIRST_DAY+" - "+process.env.LAST_DAY+" ] ")}
//}
//else { res.send(" Invalid number for START_DAY : allowed range [ "+process.env.FIRST_DAY+" - "+process.env.LAST_DAY+" ] ") }
//}
//else { res.send(" Invalid number for START_DAY_OF_WEEK and END_DAY_OF_WEEK : allowed range [ "+process.env.FIRST_DAY_OF_WEEK+" - "+process.env.LAST_DAY_OF_WEEK+" ] ") }
//}
//else { res.send(" Invalid number for END_MONTH : allowed range [ "+process.env.MIN_MOUNTH+" - "+process.env.MAX_MOUNTH+" ] ") ;
// return; }
// }
//else { res.send("Invalid number for START_MONTH : allowed range [ "+process.env.MIN_MOUNTH+" - "+process.env.MAX_MOUNTH+" ] ") ;
// return ; }
// .getMonth() : Returns the month (from 0-11)
// .getDate() : Get the day as a number (1-31)
// .getDay() : // Get the weekday as a number (0-6)
// .getHours() : // Get the hour (0-23)
// .getSeconds() : // Get the seconds (0-59)
// getDay() : Returns the day of the week (from 0-6)
var today = new Date();
var hour = today.getHours();
var dd = String(today.getDate())//.padStart(2, '0');
var mm = String(today.getMonth() + 1)//.padStart(2, '0'); //January is 0!
var yyyy = today.getFullYear();
today = mm + '/' + dd + '/' + yyyy;
console.log(today);
//console.log(process.env.MIN_MOUNTH);
//console.log(hour)
//console.log(dd)
//console.log(mm)
res.send('Client Request has been added to the storage');
});
app.get('/api/gcp/getRegion', async(req, res) => {
const { error, stdout, stderr } = await exec2('gcloud auth application-default print-access-token');
// var auth = await exec("gcloud auth print-access-token", async function(error, stdout, stderr){
if(error )
{
console.log('exec error: ' + error);
//res.send(error)
}
if(stderr )
{
console.log('exec stderr: ' + stderr);
// res.send(stderr)
}
token = stdout.replace("\r","").replace("\n","")
console.log(token)
console.log('exec stdout: ' + stdout);
//res.send(stdout);
//res.send('Activated service account credentials !');
console.log(token)
//token = "ya29.A0ARrdaM9DiVGi8sozKCsXM85SPqQ1ZsJSz9OgZJaUVshF8riiA4v69DL59yXLnjeGJDobhOm3cTZKiUXXgfYyl_k9GMp1O1sO183jfhsxlhKsbZUTNZnIG81OCewXyO5HkdoeFMoniYAiT_lsH48yjSx6fRQhEg"
var response = await axios.create({
headers: {
'Authorization': 'Bearer ' +token}
}).get('https://compute.googleapis.com/compute/v1/projects/emea-tac-project/regions')
//.then((response) => {
var array = []
for (var i = 0; i < response.data['items'].length; i++) {
// TODO: Change code below to process each resource in `itemsPage`:
array.push(response.data['items'][i].name)
//console.log(JSON.stringify(response.data['items'][i].name, null, 2));
}
res.send(array)
})
app.listen(port, () => console.log(`My first service is listening on port ${port}!`));
\ No newline at end of file
This diff is collapsed.
{
"name": "first-service",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"dev": "node-dev index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"axios": "^0.27.2",
"body-parser": "^1.20.0",
"browserify-fs": "^1.0.0",
"cors": "^2.8.5",
"dotenv": "^16.0.0",
"express": "^4.18.0",
"fs": "^0.0.1-security",
"googleapis": "^100.0.0",
"js-yaml": "^4.1.0",
"move-file": "^3.0.0",
"node-cron": "^3.0.0",
"node-dev": "^7.4.3"
}
}
{"client_id":1,"training_name":"fortipoc","region":"europe-west1","count":1,"start_month":5,"end_month":5,"start_day":2,"end_day":4,"start_hour":8,"end_hour":6}
\ No newline at end of file
{"client_id":2,"training_name":"fortipoc","region":"europe-west1","count":1,"start_month":5,"end_month":5,"start_day":2,"end_day":4,"start_hour":8,"end_hour":6}
\ No newline at end of file
{"client_id":3,"training_name":"nse2020","region":"europe-west1","count":1,"start_month":5,"end_month":5,"start_day":2,"end_day":4,"start_hour":8,"end_hour":6}
\ No newline at end of file
---
- name: Start all nested VMs
gather_facts: false
hosts: gcp
vars:
tasks:
- name: Bulk power-on
raw: "poc bulk poweron"
---
- name: Shutdown nested VMs
gather_facts: false
hosts: gcp
vars:
tasks:
- name: Bulk shutdown
raw: "poc bulk shutdown"
-----BEGIN CERTIFICATE-----
MIIFbTCCBFWgAwIBAgISAyHvI8o/mG6VurgOngduofQ7MA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0yMDA2MDkxNDMzMDlaFw0y
MDA5MDcxNDMzMDlaMCUxIzAhBgNVBAMMGiouZHluLXJvdXRpbmcuZm9ydGlsYWIu
bmV0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArdKGg+gIVANnW5C3
WLCvPRglAZUKNne1PgxJ/6UlBsbSAPoCJc+CoxDNHkHctWEnAEEPNF0M1No6swqA
0jCsEerhoNc/qFygZCjnJ9H/rtDepN9puo9Ig3bgA+OVyGMnwnbkU1C6eu+K1O9h
J2m9BviC6XCw481GCnDLtzPmZELAD7Yebhf//uMIsmGEpleTqTMae/df5CZ3dzNk
PPujBVSv7ruSS3yCGE9vH+NNFUWRXV9WVHvQyOoCtA/u3kMev/2ntqErgi6LnyPL
YmVGdHo94yCDNX/sWyjLVvfv4bdPy/9StHnqIHDOtN4saIUgl9yOBLjR0hTCUU3b
QG6SGwIDAQABo4ICcDCCAmwwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsG
AQUFBwMBBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBTULJh5EdUs
ZtGVFTR+YgyDu1ZLlDAfBgNVHSMEGDAWgBSoSmpjBH3duubRObemRWXv86jsoTBv
BggrBgEFBQcBAQRjMGEwLgYIKwYBBQUHMAGGImh0dHA6Ly9vY3NwLmludC14My5s
ZXRzZW5jcnlwdC5vcmcwLwYIKwYBBQUHMAKGI2h0dHA6Ly9jZXJ0LmludC14My5s
ZXRzZW5jcnlwdC5vcmcvMCUGA1UdEQQeMByCGiouZHluLXJvdXRpbmcuZm9ydGls
YWIubmV0MEwGA1UdIARFMEMwCAYGZ4EMAQIBMDcGCysGAQQBgt8TAQEBMCgwJgYI
KwYBBQUHAgEWGmh0dHA6Ly9jcHMubGV0c2VuY3J5cHQub3JnMIIBBQYKKwYBBAHW
eQIEAgSB9gSB8wDxAHYAB7dcG+V9aP/xsMYdIxXHuuZXfFeUt2ruvGE6GmnTohwA
AAFymba/BgAABAMARzBFAiEAo7Gaq70C8lp2hh5v3kqHq9OT9Y10LgH1/yTmUR6q
CLQCIEspmDyOnhNgGyn5dBbpOfGCSVt879wOCrbDY8713nLLAHcAb1N2rDHwMRnY
mQCkURX/dxUcEdkCwQApBo2yCJo32RMAAAFymba/jwAABAMASDBGAiEAgeTbxsL/
f3LWftLw32G3GFo4lKfCqxrzXDIDpxQn1v4CIQCTTKzrQueB3+gg5GTYLg1JS7qe
gLy/5Yk0+1T4dmYaSTANBgkqhkiG9w0BAQsFAAOCAQEAOcQVkV0gmHIkvdNVJxca
N+nE3P+R9Yk8Mi4+LLqwD8uYRVxMfG7m1woLSHuJI9vsNPBR9oUPqejIDsyFPZR6
Bw81Q1JP8kaGThJtXYUA5QXb5zMaactTbeKqNFEher7Ugusr7rlTXv43HEZJJCRj
7pwYMU3DBAVR4MxjAdttBAqNBHdOrZiG4ouNxPI2zz/AHSsATBvT8dBlcxy6rcGt
4M09QUb4DTIP2Y2kpeuDi2gwHRDmj62A/85uf9rXGmEva6kKAs8TSSXE11b5LVYU
eQQChcUPJ7PTsvKeJ9Mdxwtn+5PahhwKuha4Mh2b2Nw9fsLLd0U4KoPKrtPv59ZK
LA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/
MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
DkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0Nlow
SjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMT
GkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EF
q6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8
SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0
Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWA
a6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj
/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0T
AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIG
CCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNv
bTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9k
c3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAw
VAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcC
ARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAz
MDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwu
Y3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsF
AAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJo
uM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/
wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwu
X4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlG
PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6
KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCt0oaD6AhUA2db
kLdYsK89GCUBlQo2d7U+DEn/pSUGxtIA+gIlz4KjEM0eQdy1YScAQQ80XQzU2jqz
CoDSMKwR6uGg1z+oXKBkKOcn0f+u0N6k32m6j0iDduAD45XIYyfCduRTULp674rU
72Enab0G+ILpcLDjzUYKcMu3M+ZkQsAPth5uF//+4wiyYYSmV5OpMxp791/kJnd3
M2Q8+6MFVK/uu5JLfIIYT28f400VRZFdX1ZUe9DI6gK0D+7eQx6//ae2oSuCLouf
I8tiZUZ0ej3jIIM1f+xbKMtW9+/ht0/L/1K0eeogcM603ixohSCX3I4EuNHSFMJR
TdtAbpIbAgMBAAECggEAT75Pe+BNQc218yn3Ezcrjcmv4IPxhX9xpJ+aqy+mRu+b
lFsd9R63/ftNPt5UVNnXPKScRxeRNW1QlKby5nrx1d592H4ndCPaaVjig0AyHo8w
NU9RgAcP60/0AZS9OItUyEAnC5nzk0al2H5hgeVelP4ZgOL0I+4efde1fbzPq5q6
QlmSjywwYrfcpLfKtmaNQJ5Y4TacC1JR7C6vab9yZb8ekWm8dqiB9aPA0B40fdYQ
VzdR3mqrE8PwSeUHUdblrgTexbWg40SdC06jLW1X9mX0YiihxsNBbLzrA7EhDsf4
lHunMMEV5yoCMf6MwPt6OywS/ElhDXq2xlxq2CrQcQKBgQDZXAR3K9u+J3V35NT0
VwB2Zrz0L2vDJbj34EqPXaGo1/dizhOtfFkSERxb2m8y7uBd3EaFnCGYdBPjJKOv
Qlm9oSSwxbd7zSklwYxqGRuaTxWdDfBrP3jPx1UQVtrQQwXhzQg+SByzHmOhVeBr
SW1h3w39nktB/A5FFDF120uBxQKBgQDMuSUNcdNcbvOkWPakue6tWcuBFd5y2kRy
inS62SDk5cceOX+0tx51tvF98X2q2MV/9Fp82oIoZ8gBb9+gxTBGqpWf2Uo4RhAk
A6vcreit5vtUfWkkWK+qQq4UvTjKIlHvcrXtx9NbnmFbqApIEJlTsBXY0n4AK525
MHttAIxiXwKBgQC2IW+wd/Sqcp/wtbNnhlth2xarueyfWcWTFsMDPJ7QPx8REMLW
VOLBy8qqgO86i4U/wOrq2/geqe1cIIBzw7I0voljAlmMCE5ZT8Qbxywk8e2Xa22w
QEA4QrvZdB3n8rFEEqy8m2pJAMbVEoN5As7/+orboD9JbC583b3QFtA/TQKBgHce
f328LmSJNoD5NsIQYd1B81Rv2hhwAgW3pEYYEri9Lkfa4wDO0A1kXk2O1zUynnBe
SMx/A97ozApyAufz9KwZk6gH8dSeh8O80yI7mridPr4hnq0EYWorFEmC9GlA4PX3
g/4QGF4l4LZJJ3pZFi4Ith2MFL6aolJf8GEzQXv3AoGAb+WTjZQhNlTOqT8hwoAH
rfWy+06kVdymiS5PgxBDU35mMj4yd1AhPC2ENny1g+SNg5E5ZS12zbPUks4jKhKm
F/OIbvPw7qTXPlWQ23MbNv75CYLFtUa5Fuehdpma6bUtDaABkvdIZETR+27Wdq5W
2zQB73j/AoaQRyBLB5616jg=
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIFOjCCBCKgAwIBAgISBEtlJaHj9dETV37eml9ZpoJMMA0GCSqGSIb3DQEBCwUA
MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD
EwJSMzAeFw0yMjAzMjExNDIxMjFaFw0yMjA2MTkxNDIxMjBaMCUxIzAhBgNVBAMM
GiouZHluLXJvdXRpbmcuZm9ydGlsYWIubmV0MIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEAqy+hpvHLr+WdNBT4Cl7G+a1paMmesLR70O66zTOujfWeyuMg
eRuQ5h20g/zP0rJwzwiM5mVkc+/3TjPEDY9CqeCsSW6TU3nCTkaztoEd5wuxBTeU
1ZcNh3YlsLHmVUdR5ZDBg27Q7Mu06pIMoOtLN379hnUwH4xaREKMNM0gkgZzvspA
k+89vw6rlACUKmlqeQYx8Q8rdcL9PgttJI8Ko5HoVOT4eSwgySkJ4gqxGV6phOJV
yyA3IpPu3h8URLacH8I+Bc5BzfiI9oaog1jelFoRwsG1qtAi0jyjJQ3PXfdozZFg
cUHJmzPj6lb0AgRjAPQ5h7EMIDWDiITpbcRwrQIDAQABo4ICVTCCAlEwDgYDVR0P
AQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMB
Af8EAjAAMB0GA1UdDgQWBBQk0/xTC3f3HkdZhjr2duK2kqRnozAfBgNVHSMEGDAW
gBQULrMXt1hWy65QCUDmH6+dixTCxjBVBggrBgEFBQcBAQRJMEcwIQYIKwYBBQUH
MAGGFWh0dHA6Ly9yMy5vLmxlbmNyLm9yZzAiBggrBgEFBQcwAoYWaHR0cDovL3Iz
LmkubGVuY3Iub3JnLzAlBgNVHREEHjAcghoqLmR5bi1yb3V0aW5nLmZvcnRpbGFi
Lm5ldDBMBgNVHSAERTBDMAgGBmeBDAECATA3BgsrBgEEAYLfEwEBATAoMCYGCCsG
AQUFBwIBFhpodHRwOi8vY3BzLmxldHNlbmNyeXB0Lm9yZzCCAQQGCisGAQQB1nkC
BAIEgfUEgfIA8AB3AEHIyrHfIkZKEMahOglCh15OMYsbA+vrS8do8JBilgb2AAAB
f60RhsQAAAQDAEgwRgIhAKeu6X89JIO7SA/OzTSNWJIUUFDCKU7UnuR11LIX8g8J
AiEAsNh/GQyLiF2LGHe4DJfDGEjYuMkqEt5qy0IAxXa1XGoAdQBGpVXrdfqRIDC1
oolp9PN9ESxBdL79SbiFq/L8cP5tRwAAAX+tEYbXAAAEAwBGMEQCIAhpbs6SxpAC
N2ys66Ddrm3Z4NXQ9zBJo0GVNa4RvT9NAiBIQYeI4Qd3VrC2WSNBtG6xXwF2RPyM
ByRUT/gf6DdALDANBgkqhkiG9w0BAQsFAAOCAQEAgxOgYnKbs5HLqAd4vWdxrSw8
4MGekuVG54MdMLCGEuuFRRCNOjRc0mE4PdvaWhutPEorbQTNcFJ5OPLOsXmVZ1jn
DWrYFIMV2Q29qEGh3Q2BjIpIaxhsp2zywjYyjkRG54OC675nByFOXTsfAgvIW89y
ek+O7J4n6hxSfjgytIEiNSa89D+FlGXBzlHTBXooCVVwnoI7KB7tu6GFgjjpjKeC
rIkyeghJccBcSjUJHQv/4h1Ms+cXBTGlKNg/Zqo5/aQVHchYzERiJF4ogAyHUAsp
+BV4epZwZsaCFB0CS/C2CWpGrESWVviKAQqla/24oULpThssSD8DCHvzzHnT8Q==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFFjCCAv6gAwIBAgIRAJErCErPDBinU/bWLiWnX1owDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjAwOTA0MDAwMDAw
WhcNMjUwOTE1MTYwMDAwWjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg
RW5jcnlwdDELMAkGA1UEAxMCUjMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQC7AhUozPaglNMPEuyNVZLD+ILxmaZ6QoinXSaqtSu5xUyxr45r+XXIo9cP
R5QUVTVXjJ6oojkZ9YI8QqlObvU7wy7bjcCwXPNZOOftz2nwWgsbvsCUJCWH+jdx
sxPnHKzhm+/b5DtFUkWWqcFTzjTIUu61ru2P3mBw4qVUq7ZtDpelQDRrK9O8Zutm
NHz6a4uPVymZ+DAXXbpyb/uBxa3Shlg9F8fnCbvxK/eG3MHacV3URuPMrSXBiLxg
Z3Vms/EY96Jc5lP/Ooi2R6X/ExjqmAl3P51T+c8B5fWmcBcUr2Ok/5mzk53cU6cG
/kiFHaFpriV1uxPMUgP17VGhi9sVAgMBAAGjggEIMIIBBDAOBgNVHQ8BAf8EBAMC
AYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIGA1UdEwEB/wQIMAYB
Af8CAQAwHQYDVR0OBBYEFBQusxe3WFbLrlAJQOYfr52LFMLGMB8GA1UdIwQYMBaA
FHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcw
AoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzAnBgNVHR8EIDAeMBygGqAYhhZodHRw
Oi8veDEuYy5sZW5jci5vcmcvMCIGA1UdIAQbMBkwCAYGZ4EMAQIBMA0GCysGAQQB
gt8TAQEBMA0GCSqGSIb3DQEBCwUAA4ICAQCFyk5HPqP3hUSFvNVneLKYY611TR6W
PTNlclQtgaDqw+34IL9fzLdwALduO/ZelN7kIJ+m74uyA+eitRY8kc607TkC53wl
ikfmZW4/RvTZ8M6UK+5UzhK8jCdLuMGYL6KvzXGRSgi3yLgjewQtCPkIVz6D2QQz
CkcheAmCJ8MqyJu5zlzyZMjAvnnAT45tRAxekrsu94sQ4egdRCnbWSDtY7kh+BIm
lJNXoB1lBMEKIq4QDUOXoRgffuDghje1WrG9ML+Hbisq/yFOGwXD9RiX8F6sw6W4
avAuvDszue5L3sz85K+EC4Y/wFVDNvZo4TYXao6Z0f+lQKc0t8DQYzk1OXVu8rp2
yJMC6alLbBfODALZvYH7n7do1AZls4I9d1P4jnkDrQoxB3UqQ9hVl3LEKQ73xF1O
yK5GhDDX8oVfGKF5u+decIsH4YaTw7mP3GFxJSqv3+0lUFJoi5Lc5da149p90Ids
hCExroL1+7mryIkXPeFM5TgO9r0rvZaBFOvV2z0gp35Z0+L4WPlbuEjN/lxPFin+
HlUjr8gRsI3qfJOQFy/9rKIJR0Y/8Omwt/8oTWgy1mdeHmmjk7j1nYsvC9JSQ6Zv
MldlTTKB3zhThV1+XWYp6rjd5JW1zbVWEkLNxE7GJThEUG3szgBVGP7pSWTUTsqX
nLRbwHOoq7hHwg==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFYDCCBEigAwIBAgIQQAF3ITfU6UK47naqPGQKtzANBgkqhkiG9w0BAQsFADA/
MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
DkRTVCBSb290IENBIFgzMB4XDTIxMDEyMDE5MTQwM1oXDTI0MDkzMDE4MTQwM1ow
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwggIiMA0GCSqGSIb3DQEB
AQUAA4ICDwAwggIKAoICAQCt6CRz9BQ385ueK1coHIe+3LffOJCMbjzmV6B493XC
ov71am72AE8o295ohmxEk7axY/0UEmu/H9LqMZshftEzPLpI9d1537O4/xLxIZpL
wYqGcWlKZmZsj348cL+tKSIG8+TA5oCu4kuPt5l+lAOf00eXfJlII1PoOK5PCm+D
LtFJV4yAdLbaL9A4jXsDcCEbdfIwPPqPrt3aY6vrFk/CjhFLfs8L6P+1dy70sntK
4EwSJQxwjQMpoOFTJOwT2e4ZvxCzSow/iaNhUd6shweU9GNx7C7ib1uYgeGJXDR5
bHbvO5BieebbpJovJsXQEOEO3tkQjhb7t/eo98flAgeYjzYIlefiN5YNNnWe+w5y
sR2bvAP5SQXYgd0FtCrWQemsAXaVCg/Y39W9Eh81LygXbNKYwagJZHduRze6zqxZ
Xmidf3LWicUGQSk+WT7dJvUkyRGnWqNMQB9GoZm1pzpRboY7nn1ypxIFeFntPlF4
FQsDj43QLwWyPntKHEtzBRL8xurgUBN8Q5N0s8p0544fAQjQMNRbcTa0B7rBMDBc
SLeCO5imfWCKoqMpgsy6vYMEG6KDA0Gh1gXxG8K28Kh8hjtGqEgqiNx2mna/H2ql
PRmP6zjzZN7IKw0KKP/32+IVQtQi0Cdd4Xn+GOdwiK1O5tmLOsbdJ1Fu/7xk9TND
TwIDAQABo4IBRjCCAUIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
SwYIKwYBBQUHAQEEPzA9MDsGCCsGAQUFBzAChi9odHRwOi8vYXBwcy5pZGVudHJ1
c3QuY29tL3Jvb3RzL2RzdHJvb3RjYXgzLnA3YzAfBgNVHSMEGDAWgBTEp7Gkeyxx
+tvhS5B1/8QVYIWJEDBUBgNVHSAETTBLMAgGBmeBDAECATA/BgsrBgEEAYLfEwEB
ATAwMC4GCCsGAQUFBwIBFiJodHRwOi8vY3BzLnJvb3QteDEubGV0c2VuY3J5cHQu
b3JnMDwGA1UdHwQ1MDMwMaAvoC2GK2h0dHA6Ly9jcmwuaWRlbnRydXN0LmNvbS9E
U1RST09UQ0FYM0NSTC5jcmwwHQYDVR0OBBYEFHm0WeZ7tuXkAXOACIjIGlj26Ztu
MA0GCSqGSIb3DQEBCwUAA4IBAQAKcwBslm7/DlLQrt2M51oGrS+o44+/yQoDFVDC
5WxCu2+b9LRPwkSICHXM6webFGJueN7sJ7o5XPWioW5WlHAQU7G75K/QosMrAdSW
9MUgNTP52GE24HGNtLi1qoJFlcDyqSMo59ahy2cI2qBDLKobkx/J3vWraV0T9VuG
WCLKTVXkcGdtwlfFRjlBz4pYg1htmf5X6DYO8A4jqv2Il9DjXA6USbW1FzXSLr9O
he8Y4IWS6wY7bCkjCWDcRQJMEhg76fsO3txE+FiYruq9RUWhiF1myv4Q6W+CyBFC
Dfvp7OOGAN6dEOM4+qR9sdjoSYKEBpsr6GtPAQw4dy753ec5
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCrL6Gm8cuv5Z00
FPgKXsb5rWloyZ6wtHvQ7rrNM66N9Z7K4yB5G5DmHbSD/M/SsnDPCIzmZWRz7/dO
M8QNj0Kp4KxJbpNTecJORrO2gR3nC7EFN5TVlw2HdiWwseZVR1HlkMGDbtDsy7Tq
kgyg60s3fv2GdTAfjFpEQow0zSCSBnO+ykCT7z2/DquUAJQqaWp5BjHxDyt1wv0+
C20kjwqjkehU5Ph5LCDJKQniCrEZXqmE4lXLIDcik+7eHxREtpwfwj4FzkHN+Ij2
hqiDWN6UWhHCwbWq0CLSPKMlDc9d92jNkWBxQcmbM+PqVvQCBGMA9DmHsQwgNYOI
hOltxHCtAgMBAAECggEAd5vFSB9EIXe+2mgYUy6bulJXB1dwoKjKplZXgQ8uVJQc
ykfeJaCEIrT4rwwSrXXuakngIQ8RHAy78BEtWAgUHRwVZQ10tOurPwQZh1g563h4
zFtki8SKOG7tsMLsXAOEDnGRNGNWaU1/8DHxzvH4USNSwwLYiAKKA4235yC4NC5W
8TiLdULZsa46r/sWyWiza3LNIRnM4YezfkjPmMkTw8F7/b0LQUwwtVBvkIYQx+z3
cxAEZ8CLIoa5obpcRRO+ck1QnNDFoRV4czZ0yHp11fMNFynmAcd1J6CBS/CBxAmj
aJ9TVK1EsJCMtsqApOEDVOCM/bHgaQNRgsnY09ATxQKBgQDdGS8dUdVdIu1WNIvq
Hl9cm9x5vyfma7tPhaDRnht1bvd/Rj3xnvlAuDnXJMAqyR0wXfN2c+bSDZQKLSRh
US5xyYFj4yFT/A62viECKmyryIZ6orQBtCLdb+CKcZHkipWK6x7rlc/OH/feKQfN
Y+Bf88/lGq3hFUTEDeaIGdCnFwKBgQDGNXBPTspBjFkrp423lEHu7496Cfsu/lek
HaNysCAzhvIsXq0mBhJIK/yPehDlFfEBYOZMpOlmOkueC7Wgf/ONeaBikuH1h734
kXB6lZilFqhXUXrxVWbUYW2SvHmQtoyZU0okjbW+gtM/RP1I9XIYS9o/zmbU3S1Y
6yIqFVaA2wKBgA8VY8B1T8AN3PEvnof3UHwp6e2oW9l9agbvz9vdFHR7gIj/SsSM
GucOamvCBxYkKEifcDeZipqz8HCNSdkVx7xdieU9no1zObG/4NKcAFPr1zjQlsUy
+9ntgv0O6GwWBEO47KAX1Vhzl95hIDYj5S/Gm10+57PeVpWleR+52yE7AoGAA/V7
Sco8FfUUrt+I4BrQ+lHEnt5mKvkfjQKeiiLkccMHQUWe1byXTuO6Bq+ceMboamui
DfPZSZZufjijpxIHLlM4ld9zLfFJJRbalUg5pUp/kEbrWrim9iUACEdFclODGWjl
eTdvYt/AEmpxWKy2W6/gKxgXS7cjObxwkUCd2rMCgYBY8jdaZMzPky9sYcp/QDJq
LmXbxtXobA1VLFdLbsK5f3SeLnKCXcNhYITiOHnrMm0O57OrJ0/QTtu6ZqsCTfPx
KsKziU4qXRFin8ZXceoAepOthcIi2JKLo5zKxWZn8fMafn2HMlsHEBMT1skbaX/A
f7h5xvZroE+uXSe1tpnZQA==
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIEZTCCA02gAwIBAgIQQAF1BIMUpMghjISpDBbN3zANBgkqhkiG9w0BAQsFADA/
MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
DkRTVCBSb290IENBIFgzMB4XDTIwMTAwNzE5MjE0MFoXDTIxMDkyOTE5MjE0MFow
MjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxCzAJBgNVBAMT
AlIzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuwIVKMz2oJTTDxLs
jVWSw/iC8ZmmekKIp10mqrUrucVMsa+Oa/l1yKPXD0eUFFU1V4yeqKI5GfWCPEKp
Tm71O8Mu243AsFzzWTjn7c9p8FoLG77AlCQlh/o3cbMT5xys4Zvv2+Q7RVJFlqnB
U840yFLuta7tj95gcOKlVKu2bQ6XpUA0ayvTvGbrZjR8+muLj1cpmfgwF126cm/7
gcWt0oZYPRfH5wm78Sv3htzB2nFd1EbjzK0lwYi8YGd1ZrPxGPeiXOZT/zqItkel
/xMY6pgJdz+dU/nPAeX1pnAXFK9jpP+Zs5Od3FOnBv5IhR2haa4ldbsTzFID9e1R
oYvbFQIDAQABo4IBaDCCAWQwEgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8E
BAMCAYYwSwYIKwYBBQUHAQEEPzA9MDsGCCsGAQUFBzAChi9odHRwOi8vYXBwcy5p
ZGVudHJ1c3QuY29tL3Jvb3RzL2RzdHJvb3RjYXgzLnA3YzAfBgNVHSMEGDAWgBTE
p7Gkeyxx+tvhS5B1/8QVYIWJEDBUBgNVHSAETTBLMAgGBmeBDAECATA/BgsrBgEE
AYLfEwEBATAwMC4GCCsGAQUFBwIBFiJodHRwOi8vY3BzLnJvb3QteDEubGV0c2Vu
Y3J5cHQub3JnMDwGA1UdHwQ1MDMwMaAvoC2GK2h0dHA6Ly9jcmwuaWRlbnRydXN0
LmNvbS9EU1RST09UQ0FYM0NSTC5jcmwwHQYDVR0OBBYEFBQusxe3WFbLrlAJQOYf
r52LFMLGMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjANBgkqhkiG9w0B
AQsFAAOCAQEA2UzgyfWEiDcx27sT4rP8i2tiEmxYt0l+PAK3qB8oYevO4C5z70kH
ejWEHx2taPDY/laBL21/WKZuNTYQHHPD5b1tXgHXbnL7KqC401dk5VvCadTQsvd8
S8MXjohyc9z9/G2948kLjmE6Flh9dDYrVYA9x2O+hEPGOaEOa1eePynBgPayvUfL
qjBstzLhWVQLGAkXXmNs+5ZnPBxzDJOLxhF2JIbeQAcH5H0tZrUlo5ZYyOqA7s9p
O5b85o3AM/OJ+CktFBQtfvBhcJVd9wvlwPsk+uyOy2HI7mNxKKgsBTt375teA2Tw
UdHkhVNcsAKX1H7GNNLOEADksd86wuoXvg==
-----END CERTIFICATE-----
<
-----BEGIN CERTIFICATE-----
MIIFOjCCBCKgAwIBAgISBEtlJaHj9dETV37eml9ZpoJMMA0GCSqGSIb3DQEBCwUA
MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD
EwJSMzAeFw0yMjAzMjExNDIxMjFaFw0yMjA2MTkxNDIxMjBaMCUxIzAhBgNVBAMM
GiouZHluLXJvdXRpbmcuZm9ydGlsYWIubmV0MIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEAqy+hpvHLr+WdNBT4Cl7G+a1paMmesLR70O66zTOujfWeyuMg
eRuQ5h20g/zP0rJwzwiM5mVkc+/3TjPEDY9CqeCsSW6TU3nCTkaztoEd5wuxBTeU
1ZcNh3YlsLHmVUdR5ZDBg27Q7Mu06pIMoOtLN379hnUwH4xaREKMNM0gkgZzvspA
k+89vw6rlACUKmlqeQYx8Q8rdcL9PgttJI8Ko5HoVOT4eSwgySkJ4gqxGV6phOJV
yyA3IpPu3h8URLacH8I+Bc5BzfiI9oaog1jelFoRwsG1qtAi0jyjJQ3PXfdozZFg
cUHJmzPj6lb0AgRjAPQ5h7EMIDWDiITpbcRwrQIDAQABo4ICVTCCAlEwDgYDVR0P
AQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMB