This week there was an improvement to mod_spandsp with a channel variable added to make spandsp_start_tone_detect easier to use from the dialplan or embedded scripts
Join us Wednesdays at 12:00 CT for some more FreeSWITCH fun! And, head over to freeswitch.com to learn more about FreeSWITCH support.
New features that were added:
The following bugs were squashed:
This week we had a new feature in mod_sofia. A new parameter was added, renegotiate-codec-on-hold, for proxy hold when proxy media and proxy mode are disabled; its similar to proxy-refer.
Join us Wednesdays at 12:00 CT for some more FreeSWITCH fun! And, head over to freeswitch.com to learn more about FreeSWITCH support.
New features that were added:
Improvements in build system, cross platform support, and packaging:
The following bugs were squashed:
Hardware acceleration for video codecs is almost mandatory.
VP9 is getting a performance boostThere are three things that keep VP8 in the game when compared to H.264:
With VP9, the main worry was that it will be left behind and not get the love and attention from chipset vendors – leading it to the same fate as VP8 – abysmal, if any, hardware acceleration support. It is probably why Google went to great lengths to make it running on YouTube so soon and is publicizing its stats all the time.
This worry is now rather behind us. Recent signs show some serious adoption from the companies that we should really care about:
#1 – ARMMobile=ARM
Without checking stats, I’d say that 99% or more of all smartphones sold in the past 5 years are based on ARM.
If and when ARM decides to support a feature directly, that brings said feature very close towards world domination in future smartpones.
Which is somewhat what happened last week – ARM announced its Mali Egil Video Processor with VP9 acceleration.
Here’s a deck they shared:
ARM Mali "Egil" technical preview from Phil Hughes
Being farther away from chipsets than I were 5 years ago, it is hard for me to say if this is an integral part of an ARM processor, but I believe that it isn’t. It is an add-on component that takes care of video processing that chipset vendors add next to their ARM core. They can source the design from ARM or other suppliers – or they can develop their own.
Not sure how popular the ARM alternative is for video processing, but they have the advantage of being the first alternative for any chipset vendor (hell – they already source the ARM core itself, so why not bundle?). Which also means every other vendor needs to match up to their feature set – and improve on it.
Now that VP9 encode/decode capabilities are front and center in the ARM Mali Egil, it has become a mandatory checkmark for everyone else as well.
#2 – IntelIf ARM is the king of mobile, then Intel rules the desktop.
As with ARM, I haven’t been following up on Intel CPU acceleration lately. And as with ARM, it was Fippo who got my attention with this link here: the new Intel Media SDK.
For those who don’t know, Intel is providing several interesting software packages that make direct use of its chipset capabilities. Especially when it comes to optimizing different types of workloads. The Intel IPP and Media SDKs handle media related processing, and are quite popular by low level developers who need access to such facilities.
From the release page itself:
With this release we are happy to announce new full hardware accelerated support for HEVC and VP9.
So… HEVC (=H.265) has encode and decode while VP9 only has decode support.
Probably because HEVC has been in the works for a lot longer than VP9, but there’s hope still.
#3 – Alliance of Open MediaThe Alliance of Open Media. I’ve published a recent update on the alliance.
Intel was there from the start. The recent additions include ARM, AMD and NVIDIA.
I am sure additional chipset vendors will be joining in the coming months – there seems to be a ramp up in memerships there, with Ateme and Adobe added to their logos just last week.
While the alliance is about what comes after VP9, it is easy to see how these vendors may sway to using VP9 in the interim.
The FutureThe future is most definitely one of royalty free video codecs. We’ve got there with voice, now that we have OPUS (though Speex and SILK were there before to pave the way). We will get there with video as well.
Coding technologies need to be accessible and available to everyone – freely – if we are to achieve Benedict Evans’ latest claims: Video is the new HTML. But for that, I’ll need another post.
Planning on introducing WebRTC to your existing service? Schedule your free strategy session with me now.
The post VP9 Hardware Acceleration is Real appeared first on BlogGeek.me.
Our good old Samsung Galaxy Tab 3 7.0 Kids Tablet has finally died after over 3 years of everyday heavy use, so I needed a new solution. So far, here is the best combination that I could find:
This silicon case for Samsung Galaxy TAB A 7″ SM-T280 is a solid and protective piece, and it allows the kids hold the tablet with their little hands without slipping off. It also works as a stand, so it’s very convenient for watching videos.
The Samsung Galaxy Tab A (7″, 8GB, Metallic Black) fits perfectly into the protective case. The tablet is coming with preinstalled “Kids Mode” application, which is pretty neat, but very restrictive: the kid can watch only the videos on SD card that you mark as safe, and YouTube is not available. You can install kid-safe YouTube wrappers from the Play market, but it’s a bit too much hassle to my taste.
So, instead of the Samsung Kids Mode, I installed Kids Place by kiddoware. With a little payment, you get a good child protection mode, and you can enable YouTube directly on the child screen. The payment is also transferable to other devices under your account.
Also, this portable Bluetooth speaker works as a stand for a tablet, and it produces a much better sound than the tablet’s own speaker. Unfortunately the silicon case is too thick for this stand, but it’s a minor issue, and the speaker can easily be placed behind the tablet.
Bridging in Asterisk 13:
Over the past several years, major architectural changes have been
done in the core of Asterisk to facilitate better APIs and
functionality. Matt Jordan will talk about one of these core
improvements, the Bridging Framework, and how it evolved during the
development of Asterisk 13.
Dealing with multi-party video infrastructure can be pretty daunting. The good news is the technology, products, and standards to enable economical multiparty video in WebRTC has matured quite a bit in the past few years. One of the key underlying technologies enabling some of this change is called simulcast. Simulcast has been an occasional sub-topic […]
The post Optimizing video quality using Simulcast (Oscar Divorra) appeared first on webrtcHacks.
In my particular case, there are two physical USB devices that are represented as TTY devices in the kernel: a Gobi2000 3G modem, and a 4-port USB-to-serial adapter. The modem is presented by two ttyUSB devices, and the USB-to-serial adapter adds four more. At the machine boot, these devices get assigned random numbers ttyUSB0 to ttyUSB5, and this assignment changes between reboots.
So, this needs udev rules which would assign symlinks to these devices, and the symlinks should remain valid between the reboots.
As there’s only one physical device of each type attached to the host, we can base our udev rules on idVendor and idProduct attributes. If you need to distinguish between multiple physical devices of the same type, you have to match serial numbers in your udev rules.
The next task is to distinguish between virtual TTY devices within the same physical device. The easiest way to perform this is to extract all available attributes for two devices and look at the difference between them:
udevadm info -a -n /dev/ttyUSB4 >x4 udevadm info -a -n /dev/ttyUSB5 >x5 diff -u x4 x5The challenge with the 3G modem is that the two TTY devices are only differing in bInterfaceNumber attribute:
- ATTRS{bInterfaceNumber}=="01" + ATTRS{bInterfaceNumber}=="02"This attribute is derived during the device initialization and is not available for udev matching rules. Instead, there is environment variable ID_USB_INTERFACE_NUM which represents these values. The following commands help in identifying the needed match. The full device strings are taken from the output of “udevadm info” command:
udevadm test '/devices/pci0000:00/0000:00:13.0/usb3/3-1/3-1.3/3-1.3:1.1/ttyUSB4/tty/ttyUSB4' >z4 udevadm test '/devices/pci0000:00/0000:00:13.0/usb3/3-1/3-1.3/3-1.3:1.2/ttyUSB5/tty/ttyUSB5' >z5 diff -u z4 zThe output identifies clearly that ID_USB_INTERFACE_NUM is the variable that we can rely upon in fixing to a particular port inside the 3G modem.
Analogous comparison for the USB-to-Serial adapter shows that the ports are differing in “devpath” attribute.
So, we add the following udev rules:
cat >/etc/udev/rules.d/99-usb-serial.rules <<'EOT' SUBSYSTEM=="tty", ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="251d", SYMLINK+="ttyGOBI%E{ID_USB_INTERFACE_NUM}" SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="ttyFTDI%s{devpath}" EOTThe “udevadm test” commands as specified above help in testing udev rules without the need to reboot the host.
After rebooting, we get the following devices with persistent names:
# ls -al /dev/tty* | grep USB lrwxrwxrwx 1 root root 7 Jun 14 11:22 /dev/ttyFTDI1.1 -> ttyUSB0 lrwxrwxrwx 1 root root 7 Jun 14 11:22 /dev/ttyFTDI1.2 -> ttyUSB1 lrwxrwxrwx 1 root root 7 Jun 14 11:22 /dev/ttyFTDI1.3 -> ttyUSB2 lrwxrwxrwx 1 root root 7 Jun 14 11:22 /dev/ttyFTDI1.4 -> ttyUSB3 lrwxrwxrwx 1 root root 7 Jun 14 11:33 /dev/ttyGOBI01 -> ttyUSB4 lrwxrwxrwx 1 root root 7 Jun 14 11:35 /dev/ttyGOBI02 -> ttyUSB5 crw-rw---- 1 root dialout 188, 0 Jun 14 11:22 /dev/ttyUSB0 crw-rw---- 1 root dialout 188, 1 Jun 14 11:22 /dev/ttyUSB1 crw-rw---- 1 root dialout 188, 2 Jun 14 11:22 /dev/ttyUSB2 crw-rw---- 1 root dialout 188, 3 Jun 14 11:22 /dev/ttyUSB3 crw-rw---- 1 root dialout 188, 4 Jun 14 11:33 /dev/ttyUSB4 crw-rw---- 1 root dialout 188, 5 Jun 14 11:35 /dev/ttyUSB5
It’s good to have Fippo when there’s lack of ideas in your head.
While there are synergies abound, a flawless execution is necessaryYap. Fippo again prodded me about a topic, so here comes the post for it.
If you missed it, yesterday Microsoft acquired LinkedIn. $26.2B.
In some ways, Microsoft now rules the enterprise space – communication, collaboration and creation:
Dean Bubley puts it nicely:
The @microsoft / @linkedin deal has nailed enterprise comms federation. Complete map of who knows whom. Add Skype4B & goodbye telephony
— Dean Bubley (@disruptivedean) June 13, 2016
There’s a longform here, but I am less convinced.
I am more inclined to how Radio Free Mobile sees this:
However, for all of this to work, LinkedIn’s systems and data has to become deeply integrated with those of Microsoft which with the companies remaining independent, will be orders of magnitude more difficult.
Microsoft of late has an issue with the ability to execute and follow through.
Skype, while huge, isn’t growing since Microsoft’s acquisition. It is actually letting others take its place.
Same with Yammer. Have you heard anything about it in the last few years? The news is all about Slack, and worse still – it is about how Atlassian’s HipChat is struggling because of Slack – Yammer isn’t even mentioned as a competitor/contender in this space.
Which brings us to LinkedIn, Microsoft’s intents for it and its ability and willingness to follow through.
Back to LinkedInI wrote about LinkedIn exactly a year ago. It was about their acquisition at the time of Lynda, a learning company, and me griping on why LinkedIn isn’t doing anything about comms (and WebRTC).
The people at LinkedIn aren’t stupid. They are $26.2B smarter than I am. And frankly, that’s also $17.7B smarter than Skype.
What does that tell us?
If LinkedIn can’t find value in real time communications for its platform on its own, can Microsoft do a better job at it?
I don’t know.
–
Now lets look at the Microsoft assets that canbe integrated with LinkedIn.
Skype and LinkedInAs Dean suggested, there is some synergy in Skype connecting to LinkedIn.
LinkedIn can slap a Skype button on its profiles, making it easy to connect to the people you’re connected with on LinkedIn.
While that’s great, most communication today happens OUTSIDE of LinkedIn. You reach out to people on it, connect with them, and then shift to email and other means of communications. Especially once you know a person to some extent.
To make a point – I wouldn’t send a message to Dean over LinkedIn – I’ll make it over email. Or just ping him on Skype, because that’s where he is.
When someone asks me for an introduction, it usually goes like this: “I saw you are connected to John Doe on LinkedIn. Can you send an intro email for me?”. It happens a lot less on LinkedIn even when it is driven from LinkedIn.
Getting the communication back to LinkedIn will be hard. Getting slightly more communications from LinkedIn directly to Skype is possible, though I am not sure it will be widely accepted.
Yammer and LinkedInYammer isn’t best of breed in enterprise messaging. Not even sure if doing anything with it and LinkedIn is worth the effort.
My suggestion is to open the coffers and take out a few more billions of dollars and acquire Slack. Then throw out all voice integrations and bolt Skype in there. But that has nothing to do with LinkedIn.
Outlook/Exchange and LinkedInEmail is what drives LinkedIn in the most effective way.
Having the ability to embed and merge profiles properly into Outlook – without any ugly add-ons – that’s great.
But nothing earth shattering that we haven’t seen before with Rapportive on Gmail.
Office and LinkedInI guess that having a tighter integration between PowerPoint and Slideshare would be great. But that isn’t the reason LinkedIn was acquired.
Sarah Perez of TechCrunch wrote about the integration of Office and LinkedIn. It includes Outlook. Focuses on Outlook.
And mostly goes one-way: how LinkedIn can enrich Office/Outlook related information. A bit on how Office can enrich LinkedIn data by adding more users. But nothing about how LinkedIn’s functionality can grow. A shame.
If this is where things are headed – growing Office but not growing LinkedIn, then I am afraid LinkedIn is expecting a similar fate to Yammer and Skype. Its days of greatness will be behind it and its level of innovation and introduction of powerful features that can compete in the market – will come to an end.
Other DomainsCortana and Microsoft’s CRM are areas I missed. You can read more about them in Richard’s analysis on Radio Free Mobile.
The Corporate StructureIt seems that LinkedIn will sit as an independent entity within Microsoft under Satya Nadella directly.
I wonder how that will make things easy for the tight integrations envisioned for LinkedIn and the rest of Microsoft’s assets. How easy will it get to get the Skype team to cooperate and assist the LinkedIn team to integrate Skype for Web? What will the Office team want in return for the data they will be passing to LinkedIn? Will legal even authorize it?
There will be a lot of coordination taking place here, and I do hope that along the way, they won’t lose what’s needed to be done – there’s a lot of synergies and power here, but this will require a lot of agility from a huge company.
Back to WebRTCThis affects larger players in the UC space. If (and that’s a big if) Microsoft can connect the dots of Office, Exchange, Skype and LinkedIn – this makes for a very compelling offering. One that can differentiate and top Cisco and Google.
If Microsoft can make LinkedIn into the congregation point of people across enterprises – and not only a place to find CVs – it will be in a position to expand its offering towards real time communications in ways that others will find hard to compete against. LinkedIn lacked this vision. I wonder if Microsoft can follow through – or will they as well see it as unnecessary.
Planning on introducing WebRTC to your existing service? Schedule your free strategy session with me now.
The post Will Microsoft’s Acquisition of LinkedIn Change the WebRTC Landscape? appeared first on BlogGeek.me.
The FreeSWITCH 1.6.9 release is here!
This is also a routine maintenance release. Change Log and source tarball information below.
Release files are located here:
New features that were added:
Improvements in build system, cross platform support, and packaging:
The following bugs were squashed:
This week we had two features including adding truncate-tiers-on-load and truncate-agents-on-load options to mod_callcenter and some improvements to the verto communicator.
Join us Wednesdays at 12:00 CT for some more FreeSWITCH fun! And, head over to freeswitch.com to learn more about FreeSWITCH support.
New features that were added:
Improvements in build system, cross platform support, and packaging:
The following bugs were squashed:
Amandine and Matthew from the Matrix.org team join ClueCon Weekly with and update on Matrix.org and to announce the launch of Vector.im
Visit them on the web at http://matrix.org and http://vector.im
How time flies.
About 10 months ago, the announcement of the creation of a new alliance caught me off guard.
Somehow, Google, Microsoft and a few other companies put their differences aside and decided to create the Alliance of Open Media. The intent – create royalty free video codec to rival H.265/HEVC. I’ve written about the Aliance of Open Media. It is time to revisit the topic.
A few things happened these last few months that are worth mentioning:
I am told work is being done on the actual codec itself. From the report Jan Ozer wrote, the following is apparent:
All the right moves.
ARM and NvidiaAdding ARM and Nvidia is quite a catch.
ARM is in charge of the architecture of most smartphones on the market today, along with many of the IOT devices out there. Having them on board means that considerations for mobile and low power devices are taken into consideration by the alliance – but also that the work of the alliance will find its way into future designs of ARM.
Nvidia is where you find GPU processing power. They complement the attendance of Intel, brining the important GPU players to the table. In a recent whitepaper I’ve written for Surf, I touched the GPU issue briefly. I’ve done some research in that domain, and it does seem like the GPU is the best candidate to handle our future video coding – having GPUs relevant to this next generation codec fron the start is an important catch for the alliance.
IttiamIttiam is a recent addition to the alliance.
I’ve had the chance to know Ittiam a decade ago, while competing head to head with their VoIP software. They have expertise in the multimedia space and in video compression, but they still are the smallest (or least relevant) player in this alliance. Having them is required to fill in the ranks and grow in numbers.
It would be nice to see others join such as Imagination Technologies (who are larger and a lot more meaningful).
VidyoVidyo just join the alliance. On one hand, it surprised me. On the other hand, it should have.
Vidyo is collaborating with Google for a long time now in VPx and WebRTC. Recently it reiterated that with the work it is doing on VP9 SVC for WebRTC (you can find out more about it on a guest post Alex Eleftheriadis shared here on scalability and VP9).
Their addition to the alliance means several things:
Qualcomm is missing.
So is Samsung.
And a few other smaller mobile chipset vendors.
I think it is their loss, as well as a missed opportunity.
They both should have joined the alliance at its inception.
AppleApple being Apple, they aren’t a part of it. Putting ads in the App Store and changing subscription revenue sharing models were more important to them, which is understandable.
The thing I don’t understand here is that Apple has removed most of its support in H.265. What does it have to lose by joining the alliance?
There are three paths available to Apple:
I wonder which route they are taking here.
Content Creators and Service ProvidersWe’ve got YouTub, Netflix and Amazon already covered. The internet may rejoice.
But what about Game of Thrones? Or the next movie blockbuster? Are they staying on the route of H.265 or will they veer away from it towards the alliance?
Hard to tell, though for the life of me, I can’t understand a long term decision of staying with H.265.
It would be nice to see the large studios and even Bollywood join the alliance – or at the very least back it publicly.
TimelineIf we look at the VP9 timeline, we havethe following estimates:
H.264 is hear to stay. More worrying – H.264 will grow in popularity in WebRTC services during 2016.
This progress and success of the alliance changes nothing in the current ecosystem and the current video technology.
The future of H.265The future of H.265 does look grim. I do hope the alliance will kill it.
H.265 is in a collision course with VP9. It is still the more “popular” choice in legacy businesses, but that may change, as commercial deployments of it are small or non-existent.
The alliance simply means that a future codec is based on the VPx line of codecs instead of the H.26x ones. Now developers shifting from H.264 to a better codec will need to decide if they switch codec lines now or just later.
The royalty issues around H.265 along with the progress made in the alliance should tip the scales towards VP9 on this one.
What’s next?Money time.
Where does that leave us all?
Planning on introducing WebRTC to your existing service? Schedule your free strategy session with me now.
The post The Alliance of Open Media – 10 Months in appeared first on BlogGeek.me.
This week mod_sofia added Cisco SPA30X and Grandstream GXP user agents. Remember, ClueCon 2016 is coming up quickly so get registered today!
Join us Wednesdays at 12:00 CT for some more FreeSWITCH fun! And, head over to freeswitch.com to learn more about FreeSWITCH support.
New features that were added:
Improvements in build system, cross platform support, and packaging:
The following bugs were squashed:
H.264 is set to replace VP8 for WebRTC services.
You can thank Fippo for making me write this one.
Microsoft ended last week with an announcement of sorts on their Edge dev blog, indicating that H.264/AVC support for ORTC is now available in Edge.
But then again, it is the only way today (or at least tomorrow) to get a video call running cross browser between Firefox, Chrome and Edge. VP8 or VP9 gets you as far as Chrome and Firefox.
Which got me to this one over here. Edge support for H.264 in ORTC isn’t much. It isn’t even interesting in the bigger scheme of things (Edge has literally no market share compared to the other browsers, so why bother with it?). And still it marks a turning point – one in which we can all ask ourselves what video codec should we be leaning towards if we started developing a product that uses WebRTC today?
Last year, the answer would have been “VP8”.
A few months ago, it was, “it depends”.
Today, it will lean towards “H.264, unless you must use VP8”.
Here are 4 reasons why this is happening:
#1 – Browser interop baselineIf you want your service to get the most coverage on as many browsers as possible and you need video, then H.264 is the way to go. In a few months, H.264 will get official support by all of these vendors and that will be the end of it. Furthermore, you can expect Apple to use H.264 first and contemplate VP8 – same as Microsoft is doing now with Edge.
#2 – MobileMobile devices like H.264 more than they like VP8. Video codecs take up a lot of resources. To overcome this, mobile handsets use hardware acceleration for video codecs. They all have H.264 video acceleration (though you can’t always gain access to it as a developer). Many of them don’t even know how to spell VP8. This boils down to WebRTC implementations on mobile needing to implement VP8 using software.
Some developers ended up replacing VP8 with H.264 on mobile just because of this reason. Especially for mobile only products.
While I am sure support for VP8 is improving in new chipsets, there’s this pesky issue of supporting the billion and more devices that are already out there. And now that all browsers support H.264 in one way or another, what incentive do developers needing to support mobile apps have to use VP8?
#3 – Legacy video systemsAll them video conferencing systems? They use H.264. Most don’t have VP8. Not even in their latest released products. The way they end up supporting WebRTC until today is via a specialized gateway, on the MCU or not at all.
Transcoding was one of the main barriers to getting WebRTC to legacy video systems. It just costs a lot. It would have been easier to just go H.264 all the way. Which is what is now available.
It is one of the reasons why Cisco first worked on Firefox with Spark. It made a decision to use H.264 for WebRTC instead of transcoding from VP8.
#4 – StreamingOver 60% of the Internet traffic is video. Most of it isn’t real time video, but rather the YouTube or Netflix kind. Passive consumption.
Video streaming today is predominantly H.264 based, and at times VP9 (=YouTube whenever possible).
To get video content on an iPhone device, HLS is required, and that again means H.264.
So again we are left with the alternative of either transcoding our WebRTC generated content to H.264 when we want to stream it out – or to create it using H.264 to begin with.
Do you even care?If your service is a 1:1 calling service with no server side media processing, then you shouldn’t even care. In such a case, whatever the browsers end up negotiating will be good enough for you (and most probably the best alternative for that specific situation).
Those who invested in server side media processing, be it recording, mixing, routing – have made investments that are targeted at VP8. Modifying these to work with H.264 as well may not be trivial. For them, the decision of switching to H.264 is a harder one to make, but one that needs to be addressed.
The Future of Video Coding in WebRTCOnce we step into the future, we see VP9. And the SVC flavor of VP9.
And then there’s the Alliance of Open Media and the work they are doing towards a widely accepted next gen royalty free video codec. I’ve touched the progress they are making in my recent Virtual Coffee session
For the record, I rather hate H.264 and what it stands for. But now I must accept that it is here to stay and grow with WebRTC.
Planning on introducing WebRTC to your existing service? Schedule your free strategy session with me now.
The post 4 Reasons to Choose H.264 for your WebRTC Service (or why H.264 Just won over VP8) appeared first on BlogGeek.me.
This week we had some cool new features including a script to make memory allocation tracing easier and analyze logs, modifications to make vpx encoder use less cpu, and add an optional parameter “early-only” to only intercept the call if it is not bridged if set to true in mod_sofia.
Join us Wednesdays at 12:00 CT for some more FreeSWITCH fun! And, head over to freeswitch.com to learn more about FreeSWITCH support.
New features that were added:
Improvements in build system, cross platform support, and packaging:
The following bugs were squashed:
Bernard Aboba, Principal Architect, Skype at Microsoft and Shijun Sun, Program Manager from Microsoft’s Edge RTC Team join the ClueCon Team to give an update on Microsoft Edge and its inclusion of ORTC and WebRTC technologies.
URLs from the show:
Edge RTC roadmap blog: https://blogs.windows.com/msedgedev/2…
Edge RTC FAQ: http://internaut.com:8080/~baboba/ort…
Plugin-free Skype for Web preview:
http://blogs.skype.com/2016/04/15/new…
adapter.js on GitHub: https://github.com/webrtc/adapter
And of course see you at ClueCon.com!
Phosfluorescently utilize future-proof scenarios whereas timely leadership skills. Seamlessly administrate maintainable quality vectors whereas proactive mindshare.
Dramatically plagiarize visionary internal or "organic" sources via process-centric. Compellingly exploit worldwide communities for high standards in growth strategies.
Wow, this most certainly is a great a theme.
Donec sed odio dui. Nulla vitae elit libero, a pharetra augue. Nullam id dolor id nibh ultricies vehicula ut id elit. Integer posuere erat a ante venenatis dapibus posuere velit aliquet.
Donec sed odio dui. Nulla vitae elit libero, a pharetra augue. Nullam id dolor id nibh ultricies vehicula ut id elit. Integer posuere erat a ante venenatis dapibus posuere velit aliquet.