now towards more trustworthy Tor network by NUSINU. The talk will give examples of malicious relay groups and current issues and how to tackle those to empower Tor users for self-defense, so they don't necessarily need to rely on the detection and removal of those groups. So without further ado, enjoy and we'll see each other for Q&A afterwards. Thanks for inviting me to give a talk about something I deeply care about, the Tor network. The Tor network is a crucial privacy infrastructure without which we could not use Tor browser. I like to uncover malicious Tor relays to help protect Tor users, but since that does not come without personal risks, I'm taking steps to protect myself from those running those malicious nodes so I can continue to fight them. For this reason, this is a prerecorded talk without using my own voice. Thanks to the people behind the scenes who made it possible to present this talk in a safe way. A few words about me. I have a long-standing interest in the state of the Tor network. In 2015, I started all-net radar, which is a public mailing list and website showing reports about new relay groups and possible civil attacks. In 2017, I was asked to join the private bad relays Tor project mailing list to help analyze and confirm reports about malicious relays. To get a better understanding of who runs what fraction of the Tor network over time, I started all-net stats. It shows you also which operators could the anonymized Tor users because they are in a position to perform end-to-end correlation attacks, something we will describe later. I'm also the maintainer of Ansible Relayer, which is an Ansible role used by many large relay operators. Out of curiosity, I also like engaging in some limited open-source intelligence gathering on malicious Tor network actors, especially when their motivation for running relays has not been well understood. To avoid confusions with regards to the Tor project, I am not employed by the Tor project, and I do not speak for the Tor project. In this presentation, we will go through some examples of malicious actors on the Tor network. They basically represent our problem statement that motivates us to improve the status quo. After describing some issues with current approaches to fight malicious relays, we present a new additional approach aiming at achieving a safer Tor experience using trusted relays to some extent. The primary target audience of this presentation are Tor users like Tor browser users, relay operators, onion service operators like, for example, secure drop, and anyone else that cares about Tor. To get everyone on the same page, a quick refresher on how Tor works and what type of relays also called nodes there are. When Alice uses Tor browser to visit Bob's website, her Tor client selects three Tor relays to construct a circuit that will be used to route her traffic through the Tor network before it reaches Bob. This gives Alice location anonymity. The first relay in such a circuit is called an entry guard relay. This relay is the only relay seeing Alice's real IP address, and is therefore considered a more sensitive type of relay. The guard relay does not learn that Alice is connecting to Bob, though. It only sees the next relay as destination. Guard relays are not changed frequently, and Alice's Tor client waits up to 12 weeks before choosing a new guard to make some attacks less effective. The second relay is called a middle or middle only relay. This relay is the least sensitive position since it only sees other relays, but does not know anything about Alice or Bob because it just forwards encrypted traffic. And the final relay is called an exit relay. The exit relay gets to learn the destination, Bob, but does not know who is connecting to Bob. The exit relay is also considered a more sensitive relay type since it potentially gets to see and manipulate clear text traffic if Alice is not using an encrypted protocol like HTTPS. Although exit relays see the destination, they cannot link all sites Alice visits at a given point in time to the same Tor client to profile her because Alice's Tor browser instructs the Tor client to create and use distinct circuits for distinct URL bar domains. So although this diagram shows a single circuit only, a Tor client usually has multiple open Tor circuits at the same time. In networks where Tor is censored, users make use of a special node type which is called bridge. Their primary difference is that they are not included in the public list of relays to make it harder to censor them. Alice has to manually configure Tor browser if she wants to use a bridge. For redundancy, it is good to have more than one bridge in case a bridge goes down or gets censored. The use bridge also gets to see Alice's real IP address but not the destination. Now that we have a basic understanding of Tor's design, we might wonder why do we need to trust the network when roles are distributed across multiple relays. So let's look into some attack scenarios. If an attacker controls Alice's guard and exit relay, they can learn that Alice connected to Bob by performing end-to-end correlation attacks. Such attacks can be passive, meaning no traffic is manipulated and therefore cannot be detected by probing suspect relays with test traffic. Ornate stats gives you a daily updated list of potential operators in such a position. There are some restrictions a default Tor client follows when building circuits to reduce the likelihood of this occurring. For example, a Tor client does not use more than one relay in the same slash 16 IPv4 network block when building circuits. For example, Alice's Tor client would never create this circuit because guard and exit relays are in the same net block 192.0. slash 16. For this reason, the number of distinct slash 16 network blocks an attacker distributed its relays across is relevant when evaluating this kind of risk. Honest relay operators declare their group of relays in the so-called my family setting. This way, they are transparent about their set of relays, and Tor clients automatically avoid using more than a single relay from any given family in a single circuit. Militious actors will either not declare relay families or pretend to be more than one family. Another variant of the end-to-end correlation attack is possible when Bob is the attacker or has been compromised by the attacker, and the attacker also happens to run Alice's guard relay. In this case, the attacker can also determine the actual source IP address used by Alice when she visits Bob's website. In cases of large suspicious non-exit relay groups, it is also plausible that they are after onion services because circuits for onion services do not require exit relays. Onion services provide location anonymity to the server side. By running many non-exits, an attacker could aim at finding the real IP address stroke location of an onion service. Manipulating exit relays are probably the most common attack type detected in the wild. That is also the easiest to perform attack type. Militious exits usually do not care who Alice is or what her actual IP address is. They are mainly interested to profit from traffic manipulation. This type of attack can be detected by probing exits with decoy traffic, but since malicious exits moved to more targeted approaches, specific domains only, detection is less trivial than one might think. The best protection against this kind of attack is using encryption. Militious exit relays cannot harm connections going to onion services. Now, let's look into two real-world examples of large-scale and persistent malicious actors on the toll network. The first example, tracked as BTC MIT M20, is in the malicious exits business and performs SSL strip attacks on exit relays to manipulate plain-text HTTP traffic like Bitcoin addresses to divert Bitcoin transactions to them. They have been detected for the first time in 2020 and had some pretty large relay groups. On this graph, you can see how much of the toll exit fraction was under their control in the first half of 2020. The different colors represent different contact infos they gave on their relays to pretend they are distinct groups. The sharp drops show events when they were removed from the network before adding relays again. In February 2021, they managed over 27 percent of the toll network's exit capacity despite multiple removal attempts over almost a year. At some point in the future, we will hopefully have HTTPS-only mode enabled by default in toll browser to kill this entire attack vector for good and make malicious exits less lucrative. I encourage you to test HTTPS-only mode in toll browser and notify website operators that do not work in that mode. If a website does not work in HTTPS-only mode, you also know it is probably not safe to use in the first place. The second example actor tracked as KAX-17 is still somewhat of a mystery and that is not the best situation to be in. They are remarkable for their focus on non-exit relays, their network diversity with over 200 distinct slash 16 subnets, their size. It is the first actor I know of that peaked at over 100 gigabits per second advertised non-exit bandwidth and they are active since a very long time. Let's have a look at some KAX-17 related events in the past two years. I first detected and reported them to the toll project in September 2019. In October 2019, KAX-17 relays got removed by the toll directory authorities for the first time. In December 2019, I published the first blog post about them. At that point, they were already rebuilding their infrastructure by adding new relays. In February 2020, I contacted an email address that was used on some relays that did not properly declare their relay group using the my family setting. At the time, they said they will run bridges instead, so they do not have to set my family. Side note, my family is not supported for bridges. I was not aware that this email address is linked to KAX-17 until October 2021. In the first half of 2020, I regularly reported large quantities of relays to the toll project and they got removed at high pace until June 2020 when directory authorities changed their practices and stopped removing them because they didn't want to scare away potential new relay operators. In July 2020, an email address joined a toll relay's mailing list discussion. I started about a proposal to limit large-scale attacks on the network. Now we know that email address is linked to KAX-17. Since the toll directory authorities no longer removed the relay groups showing up, I sent the information of over 600 KAX-17 relays to the public toll talk mailing list. In October 2021, someone who asked for anonymity reached out to me and provided a new way to detect toll relay groups that do not run the official toll software. Using this methodology, we were able to detect KAX-17 using a second detection method. This also apparently convinced the toll directory authorities and in November this year, a major removal event took place. Sadly, the time span during which KAX-17 was running relays without limitations was rather long. This motivated us to come up with a design that avoids this kind of complete dependency on toll directory authorities when it comes to safety issues. And as you might guess, KAX-17 is already attempting to restore their foothold again. Here are some KAX-17 properties. After the release of my second KAX-17 blog post in November 2021, the media was quick with using words like nation-state and advanced persistent threat. But I find it hard to believe such serious entities would be so sloppy. Since they claimed to work for an ISP in every other email, I looked into their AS distribution. I guess they work for more than one ISP. This chart shows used autonomous system sorted by the unique IP addresses used at that hoster. So for example, they used more than 400 IP addresses at Microsoft to run relays. These are not exact numbers since it only includes relays since 2019 and there are likely more. If we map their IP addresses to countries, we get this. Do not take this map too seriously as the used GOIP database was severely outdated and such databases are never completely accurate, but it gives us a rough idea. To be clear, I have no evidence that KAX-17 is performing any kind of attacks against toll users, but in our threat model, it is already a considerable risk if even a benevolent operator is not declaring their more than 800 relays as a family. Good protections should protect against benevolent and malicious civil attacks equally. The strongest input factor for the risk assessment of this actor is the fact they do not run the official toll software on their relays. There are still many open questions and the analysis into KAX-17 is ongoing. If you have any input, feel free to reach out to me. After looking at some examples of malicious actors, I want to shortly summarize some of the issues in how the malicious relays problem is currently approached. It is pretty much like playing whack-a-mole. You hit them and they come back.  And while you're at it, you're also training them to come back stronger next time. Malicious actors can run relays until they get caught, stroke detected, or are considered suspicious enough for removal by toll directory authorities. If your threat model does not match the toll directories threat model, you are out of luck or have to maintain your own exclusion lists. Attempts to define a former set of do not do requirements for relays that toll directory authorities commit to enforce have failed, even with the involvement of a core toll developer. It is time for a paradigm change. The current processes for detecting and removing malicious relays are failing us and are not sustainable in the long run.  Here are some of our design goals. Instead of continuing the single-sided arms race with malicious actors, we aim to empower toll users for self-defense without requiring the detection of malicious toll relays and without solely depending on toll directory authorities for protecting us from malicious relays. We aim to reduce the risk of de-anonymization by using at least a trusted guard or exit or both. We also acknowledged it is increasingly impossible to detect all malicious relays using decoy traffic, therefore we stopped depending on the detectability of malicious relays to protect users. In today's toll network, we hope to not choose a malicious guard when we pick one. In the proposed design, we would pick a trusted guard instead. In fact, this can be done with today's toll browser if you set any trusted relays as your bridge. Another supported configuration would be to use trusted guards and trusted exits. Such designs are possible without requiring code changes in toll, but are cumbersome to configure manually since toll only supports relay fingerprints and does not know about relay operator identifiers. But what do we actually mean by trusted relays? Trusted relays are operated by trusted operators. These operators are believed to run relays without malicious intent. Trusted operators are specified by the user. Users assign trust at the operator, not the relay level, for scalability reasons and to avoid configuration changes when an operator changes their relays. Since users should be able to specify trusted operators, we need human readable, authenticated and globally unique operator identifiers. By authenticated, we mean they should not be spoofable arbitrarily, like current relay contact info. For simplicity, we use DNS domains as relay operator identifiers, and we will probably restrict them to 40 characters in length. How do authenticated relay operator IDs short AROI work? From an operator point of view, configuring an AROI is easy. Step one, the operator specifies the desired domain under her control using tolls contact info option. Step two, the operator publishes a simple text file using the IANA well-known URI containing all relay fingerprints. If no web server is available or if the web server is not considered safe enough, DNS-signed TXT records are also an option for authentication. Using DNS is great for scalability and availability due to DNS caching. But since every relay requires its own TXT record, it will take longer than the URI type proof when performing proof validation. Operators that have no domain at all can use free services like GitHub pages or similar to serve the text file. For convenience, Iren Sandler created this simple-to-use contact info generator, so relay operators don't have to read the specification to generate the required contact info string for their configuration. For the authenticated relay operator ID, the URL and proof fields are the only relevant fields. There are already over 1,000 relays that have implemented the authenticated relay operator ID. Ornate stats displays an icon in case the operator implemented it correctly. Out of the top 24 largest families by bandwidth, all but eight operators have implemented the authenticated relay operator ID already. On the right hand side, you can see a few logos of organizations running relays with a properly set up AROI. The most relevant distinction between lines having that checkmark icon and those that do not have it is the fact that the string in lines that do not include the icon can be arbitrarily spoofed. This graph shows the largest exit operators that implemented the AROI. I want to stress one crucial point about AROIs, authenticated must not be confused with trusted. Militious operators can also authenticate their domain and they do. A given AROI can be trusted or not, it is up to the user, but using AROIs instead of contact info for assigning trust is crucial, because contact infos cannot be trusted directly without further checks. This graph shows what fraction of the Tor network's exit capacity implemented the authenticated relay operator ID over time. Currently we are at around 60% already, but guard capacity is a lot lower, around 15%. The reason for that is that exits are operated mostly by large operators and organizations, while guards are distributed across a lot more operators. There are over 1800 guard families, but only around 400 exit families. How does a Tor client make use of AROIs? Current Tor versions do not know what AROIs are and primarily take relay fingerprints as configuration inputs. So we need some tooling to generate a list of relay fingerprints starting from a list of trusted AROIs. We have implemented a quick and dirty proof of concept that puts everything together and performs all the steps shown on this slide to demonstrate the concept of using trusted AROIs to configure Tor client to use trusted exit relays. It is not meant to be used by end users, it merely is a preview for the technical audience who would like to see it in action to achieve a better understanding of the design. The current proof of concept performs all proof checks itself without relying on third parties, but since there are a lot of reasons for doing proof checks centrally instead, for example by directory authorities, I recently submitted a partial proposal for it to the Tor development mailing list to see whether they would consider it before proceeding with a more serious implementation than the current proof of concept. I find it important to always try achieving a common goal together with upstream first before creating solutions that are maintained outside of upstream because it will lead to better maintained improvements and likely a more user-friendly experience if they are integrated in upstream. Here is a link to the mentioned TorDev email for those who would like to follow along to summarize. After reviewing some real-world examples of malicious actors on the Tor network, we concluded that current approaches to limit risks by bad relays on Tor users might not live up to Tor users' expectations, are not sustainable in the long run, and need an upgrade to avoid depending on the detectability of malicious relays, which is becoming increasingly hard. We presented a design to extend current anti-bad relay approaches that does not rely on the detection of malicious relays using trusted authenticated relay operator IDs. We have shown that most exit capacity has implemented AROIs already, while guard capacity is currently significantly lower, showing a lack of insights on who operates Tor's guard capacity. When publicly speaking about modifying Tor's path selection in front of a wide audience, I also consider it to be my responsibility to explicitly state that you should not change your Tor configuration options that influence path selection behavior without a clear need according to your threat model to avoid potentially standing out. Using trusted AROIs certainly comes with some trade-offs of its own, like, for example, network load balancing to name only one. Thanks to many large trusted exit operators, it should be feasible in the near future to use trusted exits without standing out in a trivially detectable way, because it is harder in the sense of takes longer to statistically detect a Tor client changed its possible pool of exits if it only excluded a smaller fraction of exits. Detecting Tor clients using only a subset of all guards takes a lot longer than detecting custom exit sets, because guards are not changed over a longer period of time when compared with exits. And finally, Tor clients that make use of trusted AROIs will need a way to find trusted AROIs. Ideally, they could learn about them dynamically in a safe way. There is an early work in progress draft specification linked on the slide. I wanted to dedicate this talk to Carsten Lusing, who passed away last year. He was the kindest person I got to interact with in the Tor community. Carsten was the Tor metrics team lead, and without his work, my projects Ornat stats and Ornat Radar would not exist. Every time you use metrics.torproject.org, for example, the so-called relay search, you are using his legacy. Thank you for listening, and I'm really looking forward to your questions. I'm not sure I'll be able to respond to questions after the talk in real time, but it would be nice to have them read out so they are part of the recording. And I'll make an effort to publish answers to all of them via mastodon should I not be able to respond in real time. I'm also happy to take tips about unusual things you observed on the Tor network. Do not underestimate your power as Tor user to contribute to a safer Tor network by reporting unusual things. Most major hits against bad relay actors were the result of Tor user reports. Okay, thank you very much for this very informative talk. And yeah, so we will switch over to the Q&A now. And yeah, thanks again. Very fascinating. So we have collected several questions from our IRCD chat. I'm just going to start. If bridges don't need my family setting, isn't this a wide open gap for ant to end correlation attacks? For example, for malicious actor can somehow make their relay popular as bridge? Yes, bridges are a concern in the context of my family. For that reason, it is not recommended to run bridges and exits at the same time in current versions of Tor. But future versions of Tor will get a new and more relay operator friendly my family setting. That new my family design will also support bridges. This will likely be in Tor 0.4, 0.8, 0.X at some point in 2022. Okay, thanks. Despite what kind of attack is there or other statistics who or from which country these attacks are coming most background here is there are rumors about NSA driven exit notes. I don't know about any general statistics, but I usually include used autonomous systems by certain groups when logging about them. There are some autonomous systems that are notorious for being used by malicious groups, but malicious groups also try to blend in with the rest by using large ISPs like Hetzner and OVH. Thanks. Is using a bridge that I host also safe than using random guard? This is a tricky question, since it also depends on whether it is a private bridge, a bridge that is not distributed to other users via bridge DB. I would say it is better to not run the bridges you use yourself. Okay, what is worse KX-17 or a well-known trusted operators running 20% of Tor's exits? Currently, I would say KX-17. Okay, and I think that's the last one for now. Isn't the anonymity bit not decreased or changed while using a trusted relay list? Yes, this is a trade-off that users will need to make. This heavily depends on the threat model. Okay, so I think we have gathered all the questions and they were all answered. So thank you again for...


In the last session, we were talking about the sociological theory and today we are going to take it forward with another theory which is quite similar, but again has its own distinctive features and that is the resource dependency theory. Now, ladies and gentlemen, like we were looking at the sociological theory and we were talking about equity and we were talking about fairness within society and the distribution of power and wealth in a better way. Now, when we look at the resource dependency theory, then again from its very name we see that it is about resources and how the organizations are dependent upon those resources and how we can see resources beyond financial resources. So, ladies and gentlemen, let us look at this from a more articulated way on the slides and we can see the resource dependency theory and then we will go into a discussion. So, when we are looking at the resource dependency theory, then it concentrates on the role of board directors in providing access to essential resources and it focuses on the appointment of representatives of independent organizations. Now, ladies and gentlemen, these are two very important points and features of the resource dependency theory. Usually in organizations, we are just looking at finance, we are looking at stocks, we are looking at infrastructure, we are looking at human resource and our employees and their knowledge, skills, competencies and their abilities, we are looking at technology, we are looking at raw material. So, we usually think that these are the resources, but a very, very important resource is also our board of directors. Now, if we have a more diversified board of directors, then those diversified board of directors can also become ambassadors, can also become catalyzers, can also become magnets, can also become facilitators, can also become propagandists who can provide and provide access to essential resources and how is it done? It is done by basically appointing representatives of different organizations. So, when you have representation from different organizations and let us say that there is a company A and that company A has a board of directors which is very diversified and represents, for example, let us say the legal community, let us say the auditing community has directors who come from different stakeholders, from different large organizations then they also bring along with them their own social capital and their own equity and that equity is their personal equity because they are well networked, they have the contact. So, they can always assist the organization from a legal context in a better way to do different work because through their resources and through their network, they are able to do that. There is a study by Harvard University which basically states that the success depends on 40 percent on networking. So, now in the modern 21st century, it is about networking and networking again is how you have contact and therefore, the board is very, very important and critical to be diversified, to have such a texture whereby it can access multitude of resources due to their connections, due to their network, due to their social capital. So, that is very important. Now, let us see how we can further look at it in a more integrated way. So, let us look at it from a more intense context so that we can see what are the different elements of the resource dependency theory. So, when we are going to be looking at that, then we basically see that representatives as a means for gaining access in resources critical to firm success, the provision of resources enhances organizational functioning, firms performance and its survival. So, ladies and gentlemen, when we are talking about this board, this board becomes very critical. It does not go into the tactical operations of the organization. It is providing strategic input, but it is going a little bit beyond strategic input whereby it is ensuring that wherever they can, they can provide better alternatives, they can provide better resources, they can provide better connectivity, they can open closed doors and close windows, they can create a network for the management of the organization which would actually enhance the organizational functioning, would enhance the firm's performance and also ensure its survival through a longevity approach. So, that is very, very important, ladies and gentlemen. Now, let us look at the different type of directors or different type of representation which can be in the board whereby the organization would benefit from that diversity within that particular board. So, let us look at that. So, when we are looking at that, then we see that directors can be broadly classified into four categories. First, the insiders. Second, the business experts. Third, the support specialists and fourth, the community influential. So, let us now tend to further elaborate on these four. When we are talking about the insider, then we basically mean that they should be a representation from within the organization. Now, that is also very important because that insider would be able to give a critical overview or insight to the rest of the board directors. So, that is a very important position and that insider basically also creates a bridge between the board and the rest of the organization because that insider is conversant and tends to comprehend the fabric of the organization, the environment of the organization, the nuances of the organization, the tendencies and the various pros and cons within the organization and therefore would be able to mold the board in a far better way to become more responsive to the real needs of the organization. The second type are the business experts. Now, these business experts definitely have their own areas like I was mentioning. It could be finance, it could be audit, it could be law, it could be procurement, it could be a specialized sector approach whereby these sector experts who have a good reputation within the market, they can also become directors because they would be able to influence that particular sector for the betterment of the organization. Now, the third type are the support specialists. Now these support specialists could be policy makers, could be strategists, could be experts in a particular area for example, could be a Kaizen expert, could be a resource expert, could be an expert in procurement. So these different support specialists are also very important for any board or organization in the context of this resource dependency theory. But a very, very important one is actually the fourth one, the community influencers. Now these people are very critical to any large organization and any large organization should have a community influencer within them. These advocacy experts, these political experts, these community experts are very, very important because they are able to mold the opinion of a particular community or a particular society for the benefit of the institution. Now, this is not manipulation, it is again how they represent the organization to give the community a clear and better picture whereby rather than creating dissension or rather than creating animosity or rather than creating conflict, actually all of that is basically streamlined into a better relationship of the community with the particular organization. So this type of diversity is very, very important. These four broad categories basically represent a better board, a more resource dependent board, a more involved and embedded board, a more responsive board, a more compassionate board, a more empathetic board. So this model again in the 21st century is very important and ensures the consolidation, the reinforcement and the longevity of an organization. Thank you so much.


What's up, everyone? It's your girl, Kenty here from Layton Sports Cards, and I'm ripping a personal here for Nathan S. We've got, uh, 21-22 Panini Crown Royale basketball hobby. Alright, best of luck, Nathan. Thanks for hopping in and for your patience. Let's see. I don't know, JB. That was crazy. That was crazy. We've got Crystal LeBron James. Wow. There you go. Nice start there, Nathan. And to 49, Red Crystal Rookie for the Thunder Jeremiah Robinson Earl. And we've got Jalen Green Rookie Rockets. Kai Jones Rookie for the Hornets. Anthony Davis and Isaiah Livers Rookie Pistons. We've got Heats, Coat of Arms of Bam, out of Bio. Some bam there for the Heats. And your auto, Nix Rookie Auto to 99, Miles McBride on the Nix Rookie Auto. Alrighty, Nathan. That'll do it for your box. Congrats again on your hits. Thanks for hopping in and we'll get this right out to you.


comment. And what you see here, probably a lot of you recognize this. This is a cathedral peak in Tulumny Valley of Yosemite. And the reason why I'm showing this, this is a discovery that got published literally just days ago in the proceedings of the National Academy of Sciences. A group of scientists trying to figure out why are there trees in California. And here's the problem. California, we get seasonal rain and then a long drought. And now here you see trees growing on sheer granite.  And so they're trying to figure out why are they able to grow. Notice you're seeing some of those fir trees and pine trees up on the steepest slopes of a cathedral peak. So you wonder how do they ever get there? And how are they able to survive there? Well, what this group of research scientists discovered is that the reason why trees are able to survive on hills in California in spite of our long seasonal droughts is that they draw their water from bedrock. And as we've all known that trees draw water from soil. And there's moisture in the soil. But if you've got an eight month drought, the moisture that's in the soil will be exhausted. And actually what they discovered in this study is that the trees basically use up soil moisture in about one month. So if you go more than a month without rain, the soil moisture is gone. But these trees are trees are still there. Well, they actually discovered that the moisture in the bedrock below the soil is more abundant than the moisture that's in the soil itself. And that 27% plus of the moisture that keeps the trees alive, they get from the bedrock. You say, well, how do they actually get it out of the bedrock? Well, what happens is that you get snow and ice falling on mountains like this. And what happens is the water freezes and melts. And the water freezes and melts and makes tiny cracks in the rock. Well, these trees are able to take their big roots and send off little tiny roots into the cracks. And they can draw water from the deep bedrock. And the advantage of that is that deep bedrock is so far below ground that it doesn't evaporate easily. The soil moisture is subject to sunlight and can evaporate. But the stuff that's a 10 feet fact, they found that these trees are able to draw moisture even from 40 feet below this solid rock, basically sending roots down these little tiny cracks.  And the root expands so slowly and has such hard material around the other part of the root that it actually expands the crack and makes the crack bigger and creates more cracks, which allows more roots to go down and which actually allows the tree to draw moisture from deeper and deeper into the bedrock. And in one case, even as much as 40 feet down into the bedrock. It's indicative of design. Moreover, it's indicative of why we're here today as human beings. Because as these trees grow on this very steep, granite type rock, they're basically breaking the rock up. And as they break the rock up slowly, it allows more rain to come into contact with the silicates. That's basically what continents are. They're basically ocean floor that gets hydrated to become silicates. And because silicates are lighter than the basalts at the bottom of the ocean floor, they float up and eventually become continents. But as you'll see in my book, Unprobable Planet, when rain falls in silicates, it sets up a chemical reaction where the rain acts as a catalyst, pulls carbon dioxide out of the atmosphere, reacts with the silicates and makes carbonates in sand. Well, the carbonates in sand actually provide critical nutrients for the trees. And so this chemical reaction that's set up by rain falling on the silicates provides the trees with valuable nutrients, which allows the tree to grow and make bigger cracks, which allows more rain to come into contact with the silicates, which makes more carbonates and makes more sand, which provides more nutrition for the trees and allows these tiny trees become big trees. And so the very the fact that the trees grow so slowly, and you notice that on these high mountain slopes, the trees go very slowly. Well, they grew fast, this wouldn't work. It's a slow growth that actually allows the production of more and more sand and carbonates, which allows more nutrition to go to the trees, allows them to get bigger, allows them to make bigger cracks, and allows more of this carbonate and sand to be formed. But here's where we benefit. That whole process pulls carbon dioxide out of the atmosphere. So the sun is getting brighter and brighter, our atmosphere is becoming less and less efficient in its capacity of trapped heat, which keeps the temperature in the surface of the Earth optimal for life. And that's the amazing thing about our planet. We've had an optimal temperature for life for 3.8 billion years. And because of that 3.8 billion years, human beings can exist on planet Earth and have the civilization and technology for billions of us can live together here to the gospel message and respond to that gospel message. Thanks to the technology we have. And we wouldn't have that technology if we didn't have the huge amount of sand and carbonates produced by this process. The freeways you drive on is sand and carbonates. You're basically driving on sand and carbonates. And our planet didn't begin with any, but it's thanks to the plants that God designed and created at just the right time and just the right order. Because these trees are very efficient at exposing more silicates to rain, which produces more carbon, carbonates and sand and pulls more carbon dioxide of the atmosphere. And if you actually look at the fossil record, you see it, the life that we see at different times is progressively more efficient and enhancing this weathering of the silicates. So the weathering began at a very slow, low level. And now it's at the highest level it's ever been. So for example, if you compare the silicate erosion you get from fir trees and pine trees with that that you get from mosses and algae. It's about a factor of four to five times different. In other words, these trees will pull out five times the quantity of carbon dioxide of the atmosphere that you get from mosses and algae. And so we wouldn't be here unless we had a very precisely fine tuned history of introduction of the right kinds of plants and trees at just the right time. And order for us to exist today, you want these trees to appear about 300 million years ago. And that's when they appear and you want them to have increasing abundance, which is what we've seen. And so when you go home today, thank God for all these trees that God designed. So at these hills and incidentally, once this is going, this is what it transfers into for literally this whole steep slope becomes nothing but a forest. That can't happen unless you first start with this. So this is the beginning. And as that goes on, it eventually becomes heavily forested. And here's an example where you see trees growing very thickly on an extremely steep silicate to slope. That can happen. Thanks to this fine tuning. Yes. We're not when I heard that water is the only substance that expands for different reasons. Is that designed by God to do that to make those cracks? Well, water is a unique solvent. And yes, then the frozen state, it is actually less dense than it is in the liquid state. And if that weren't the case, the water on planet Earth would be frozen all the way down to the bottom. But it's because liquid water is lighter, that that doesn't happen. So the icebergs would sink and that would be a problem because then the ice would accumulate at the bottom. And we have very little liquid water. However, you'll see an article that I'm going to be coming out with in a couple of weeks on my blog site at reasons.org that if you've got it'll be like two weeks from now, that a typical Earth like planet has oceans 1000s of miles deep. And when you got oceans 1000s of miles deep, the pressure of the liquid water becomes so extreme at the bottom of that water column that it actually freezes. So yeah, you actually can have frozen water in two states, frozen water, the floats and frozen water that's at the bottom. But you only get frozen water at the bottom. If you've got a lot of water on top of it, if you only got say 10 miles of water, it's not going to freeze. But if you got several hundred miles of water, then you have the pressure is so extreme, it causes the water at the bottom to freeze. And basically, the article I'm writing is making a point that that's a planet on which you can't have life. Why? Because you've got this frozen layer separating the liquid water from the rock below, which means there's no chemical exchange going on between the water and the rock like you have here. Here you got a chemical exchange between water and rock. But if you got a frozen layer that blocks the liquid water from the rock below, then that exchange can't happen, which means that there's no possibility for life remaining more than just a few months on such a body. And I actually wrote that article in part to I'm sure we got some JPL folks here. Okay. I just heard about Yeah. Okay, you're probably aware that one of the JPL plans is to actually go to Europa and drill a hole through at least 26 kilometers of ice with a hope that there's liquid water below that ice and there may be because of the tidal friction with Jupiter and then put a movie camera down that hole, have it swim around in the ocean below and look for microbes. But one reason I wrote this article is make the point. Well, the same thing is going to happen to Europa. Europa is 35% water. And so if there is liquid water below the frozen crust, then you're going to have the same thing happen where you're going to get another frozen layer that separates the liquid water from the rock below. And so maybe we can save JPL a few million dollars. Not a few million. I here's a $3 billion project to make that work. It was 2 billion, but they now had to add another billion. What's a billion here and a billion there. But you know, I'm convinced JPL could really use that $3 billion for much more productive purpose. And this just got published. And I think this is going to be exciting because there's been speculation well, maybe we should go to Titan and drill down and see what's in Titan because Titan is mostly Titan, Callisto, Europa and Ganymede. These are bodies of moons in our solar system that are more than 30% water. In fact, some of them are as high as 65% water. But the bottom line is that they got that much water. There's going to be a frozen layer between the rocky interior, any possible liquid water that exists above. Last time I got to speak at JPL, I said, well, before we spend the $3 billion, it'd be a good idea to have a satellite that orbits Europa. Because if you orbit Europa, that will tell you whether you got the tidal heating that would actually liquefy the frozen ice. And you know, that can be done quite cheaply. We're not talking billions of dollars, we're talking tens of millions of dollars to make that happen. And we could do that with Callisto and Titan, all the others, just to make sure that Rudy has liquid water there. But basically, this paper that's been published is saying, no problem, we already know it's a non-candidate because there's a big guarantee to be a frozen layer separating the rocky interior from the water. Well, if they're not tidally locked, I mean, like the four big moons of Jupiter, they're all in resonance with one another. So there's tidal heating between them. But yeah, I mean, there's reasonable evidence that Europa's close enough to Jupiter that it's tidally locked and that tidal heating is enough to actually melt that ice ball of a moon. But we don't know for sure. The only way to know for sure is to actually put that one of the models I saw is as much more likely that Europa has slush below the surface rather than liquid water. But it could be frozen, it could be slush, it could be liquid. But if you put a satellite around Europa, that actually will determine how much tidal heating you actually got going on here first. And then I want to get to Isaiah. These are good questions. What drove this study is okay, there are parts of British Columbia and the state of Washington, for example, we also have trees growing on very steep slopes, but it rains all the time there. So that's where they get their moisture from. It just rains all the time. But they're looking at California. So we got the same phenomenon in California, but we got long drought seasons. Where do they get their water from? Because we know that they're going to exhaust the soil water very quickly. And so that's what and what they did is they put boreholes deep into the bedrock and measured the moisture. And they said, Wow, there's a whole lot more moisture here than we ever dreamed of. And so that that was the whole focus of the study. But yeah, it's the first time anybody has actually drilled boreholes. Excuse me. And over a two year period, measured the moisture content. And I said, This is why we got trees on steep slopes in California, because you know, we get these rains and a lot of the moisture seeps into the bedrock and remains there and the trees can draw them out over the whole eight to 10 month period where we don't have any rain. Oh, yeah, yeah, we know that if you have sufficient pressure on the liquid water, it will freeze. But but you need a lot of need a lot of pressure. And yeah, if you've got several hundred miles deep of ocean, you're going to get sufficient pressure to make ice at the bottom and it will be permanent. It's not ice that comes and goes. It would actually be a permanent barrier, separating the liquid water from rock below. Now as far as your question about Well, should we not be cutting down trees? There was a study published about two and a half years ago. And I wrote an article on this on our website as well. You can search and find it, making the point that if you want to most efficiently draw greenhouse gases of the atmosphere, you need to harvest the trees at an optimal cycle of harvesting. Because what they found is rapidly growing trees, pull out more carbon dioxide than old growth forests by about a factor of two. Okay, but what the problem is, is if you over lumber, you wind up actually getting less greenhouse gases pull of the atmosphere. And if you don't lumber enough, you wind up pulling less greenhouse gases of the atmosphere. And depending on where you are in the tropics, or the temperate, there's a lumbering cycle. And I believe the lumbering cycle or kind of our latitude, it's about once every 100 years. So yeah, if you harvest every 100 years, they're going to maximize the amount of greenhouse gases you pull out of the atmosphere. And so there's a difference between the new growth like when you plant a little tree, it doesn't pull much out. And old growth, the metabolism goes way down. You want trees in the middle. You want the fast growing trees to be predominant. And what I find amazing is that harvesting cycle lumbering cycle, it's also the most economic. That's where lumbering companies make the most money. So isn't it interesting that you have the optimal economy, identical with the optimal strategy for stabilizing our climate. The two are the same. And my suggestion writing the article is we're probably going to find that to be ubiquitous throughout our study of our ecosystem. Always look for that optimization. Okay, with that, we have a question over here. Okay, go ahead. John, I don't know the number. What I do know is you need something in excess of 300 miles thickness of ice. No, pardon me, not that much. I think all you need is 100. Something like that. Yeah. So yeah, well, basically, it's the pressure, there's a certain number of water pressure, where it will become frozen.  They said there's no doubt that it's got a frozen ice barrier. Europa may be small enough that it might not have that. And so that's where lab experiments need to be done to actually get that number. What is the number where we know for sure it's going to be permanently frozen. But like with Titan and Ganymead, there's no doubt, but the smaller moons Callisto and Europa, that still needs to be settled. So maybe we still should go ahead with the project. But the bottom line is let's do the cheap lab experiments first, and see what it tells us. So yeah, you out of liquid water in the polar region, right? Yes. Yeah, I mean, well, yeah, the question, though, is Callisto, we know it's got a frozen surface crust. And because there's geysers, there's liquid water below, we need to know how much liquid water is, and is there a frozen layer separating that liquid layer from the interior rocky layer. But yeah, I mean, the papers I've read, they don't actually say given number for exactly when it goes up frozen. But they basically did calculations where they're saying, if you got this much water for certain it's frozen, but it'd be good to actually have a number about where it happens. So you're saying the rock is necessary for the liquid water to touch the rock. For life, you need the liquid water to be in contact, but there needs to be a chemical exchange going on. And so if you got an ice barrier that prevents that chemical exchange. Okay, one more question or the question over here somewhere. Oh, great, great question from the online. Hey, very good question. Do y'all hear that? Okay, the question was, okay, even talking about how we need these billions of years of life history to have human beings and human civilization. That's because we need a lot of carbonates and a lot of sand. And we need a lot of concentrated metals have been concentrated by the bacteria. We need a lot of oil, natural gas, and the coal. And that's all here because we're at the end of the line for life on planet Earth, which means we have the maximum biodeposites we can draw from the crust of the earth to sustain for civilization. But the question that came over the chat line from our virtual audience was, okay, why didn't Jesus come now when we got high technology that would have made it possible for all of his sermons to be broadcast much more quickly and efficiently than it was when he came 2000 years ago? Can you explain why he came 2000 years ago? Now I've also gotten a reverse question. I mean, why didn't Jesus come earlier? So that 4000 years ago people back then could I say, aha, now we understand what we see being revealed to us through the record of nature. Why not earlier or why not later when you got the bigger population and the technology? Well, I addressed that question in this class about four years ago. So I'll try to be brief and repeating it, you can go back four years and get the MP3s. So good luck on trying to search for those. But anyways, what you notice about the coming of Jesus of Nazareth, he came at a time in history, when for the first time, there was significant peace over a large area. He came during the reign of Caesar Augustus. And Caesar Augustus says, I'm not going to do what my uncle did. My uncle fought all these wars expanding the Roman Empire. He says, we got a big enough empire says, we're not going to try to expand the empire. And he established what's been called Pax Romona, Roman peace. And so all these provinces that they had conquered, what Caesar Augustus did is he instituted legislation, basically making it beneficial for all these conquered provinces to stay with the Roman Empire, basically gave them an avenue so they could become Roman citizens, they could join the Roman army, they could participate in the Roman economy. So all these different provinces, rather than rebelling against Rome said, hey, we got a good thing going here. This Roman hierarchy has actually set up a very good situation for us. The other thing Caesar Augustus did is he built this system of roads. Because he says, you know, even though we have this peace and this commitment not to fight expansion wars, things can happen. And there's bound to be places of unrest. And he didn't want to have a large Roman army situated all over the place. So he said, what we're going to do instead is we're going to build this system of roads. And then we're going to train our legions so that they can march 50 miles a day. And that's the amazing thing about the Roman army. Their average height was five feet, Roman soldiers. But they were trained to be able to carry 100 pounds on their backs and march 50 miles a day. Now they're able to do that because they had this amazing road system. They didn't have to tramp over, you know, trails. They had these roads. And the roads were designed so that they could actually take supplies with them. So they're typically, you know, eight to 10 feet wide. And the way Caesar Augustus designed them, these roads had a bed that was like, you know, six to eight feet deep. So these were roads that to this very day are still being used of how well they were built by Caesar Augustus's engineers, which is one thing inherited from his uncle, Julius Caesar. Julius Caesar was able to conquer the vast stretches of territory, because in his army, he had engineers. And thanks to the engineers that he was able to win the battles that he was able to win. I say that for the benefit of all you engineers here in the audience. I would encourage all you engineers read the account of Julius Caesar's campaigns. And you'll see how critical the engineers were to winning battles on the often Julius Caesar faced enemies that had far more numerous soldiers than he had. But one time he took on 70,000 trained soldiers and in the Swiss area, and they had an average height of seven feet. And so here was a smaller army five feet tall, and they were able to beat them because of superior engineering. So hey, thank all the engineers that you know. Well, yeah, yeah, five feet, you're able to walk faster than someone is seven feet. And that's the thing. What Caesar Augustus wanted was a strategy. Okay, we got unrest in a province. That's 1000 miles away. We're going to be able to get 10 legions there. Within, you know, 20 days, because we're going to march them at that speed. And these soldiers were in such a good shape, they could literally march for 10 days at that rate, and fight a battle the next day. That's how good a shape they're in. So that's why they never lost. But notice what God did. He sent his son, Jesus Christ, to planet Earth, when there's this amazing transportation system setup. Also thing you notice in the days of Caesar Augustus, is that he and his uncle and others took care of the pirate situation in the Mediterranean. And so for the first time, it was safe to have shipping going throughout throughout the whole Mediterranean. And that's basically what held the Roman Empire together, was able to trade and move people safely throughout the whole Mediterranean Sea. And so what happened is the disciples of Jesus, and you see the disciples in the book of Acts, they took advantage of the shipping routes, and these incredible Roman roads to quickly send the gospel throughout the entire Roman Empire, and beyond. In fact, the road system actually extended into Parthia. And that explains how the early Christians were able to get to India so quickly. And so basically the answer to the question, God sent Jesus to planet Earth at the earliest moment in human history, when it was possible to change the evangelistic strategy. In the Old Testament, the evangelistic strategy was, I want you followers of God to stay at a special location I picked out for you, a location where three continents come together, Africa, Europe and Asia. And as these nations trade with one another, they're going to have to pass through your territory. When they pass through your territory, tell them the good news of how they can come into a relationship with a creator of the universe. When Jesus came, he instituted a brand new strategy. I don't want you staying in one place. I want you to go out to all the parts of the earth. But it was the first time when that evangelistic strategy could actually work. Because you had this Pax Romona, you had these amazing roads, you had these cities set up everywhere. Jews were scattered throughout all the Roman Empire. This is a diaspora. Because you notice the strategy Paul would use, he would travel to a city, and he would preach first in the synagogue. Because there he knew he'd find people who are familiar with the Old Testament. And he would show them how the Old Testament prophesied the coming of the Messiah. The timing of the coming of the Messiah. When you read the book of Daniel, it actually prophesied the date when the Messiah would come. And what would always happen is, Paul and other disciples were able to lead a significant number of Jewish believers in the scattered cities throughout the Roman Empire, to the Christian faith. And then he would take the message first when the Jews then out to the Gentiles, and basically hold a meeting in a big auditorium. That's the other thing that was unique to Caesar Augustus. He said, we're going to actually build these amphitheaters all over the Roman Empire. And notice how frequently Paul preached in an amphitheater. Now these Roman amphitheaters were amazing. I don't know how many of you've ever visited one of them. I've been to a few of them. And it's really great. It's actually, these amphitheaters typically were set to house 25,000 people. But if you go down to the bottom of the stage and have the amphitheater around you, you can actually speak to 25,000 people without a microphone. Because of the acoustics, basically the Romans figured out how to design the acoustics so that a large crowd could hear people without microphones. And notice that Jesus sometimes took advantage of that. Remember the time he preached the sermon on a hillside by Galilee? He basically found an area that had a natural amphitheater to it. And he was able to get out in the boat and actually have everybody hear him. Because yeah, he didn't have a microphone like I have. And I'm probably just addressing this crowd here, right? But that's the answer to the question is the earliest time in history where a new strategy could be developed, where Jesus was able to say to the disciples, take the good news, preach the first year in Jerusalem, then Judea, then Samaria, then the outermost parts of the earth. And notice how quickly it got to the outermost parts of the earth. There's actually a denomination in India that traces its roots back all the way to the first century AD. And that's all because there was a transportation system in place that made that possible. And there was peace between Parthia and Rome at that time that actually allowed trade and transportation of people to go between those regions. So anytime you get a question like that coming through the chat room, let me know that was a great question. All right. How much time we got left for Isaiah? Okay, we got some time. All right. You recall, and I didn't bring the questions with me, I'll bring them next week. Maybe some of them are floating around here as you can distribute. But we're going through the book of Isaiah and basically looking at all the texts in Isaiah that deal with the doctrine of creation. You've got 10 questions that are going to guide us through the doctrine of creation. But question number one has to do, what does the book of Isaiah say about the creation of the universe and how God creates the universe? And of all the books of the Old Testament, it's the book of Isaiah that says the most about the origin of the universe and how God brings about this universe. And there's like 22 passages that we're going to be going through. Let me just zip through these quickly and get some of the new ones you haven't covered yet. Because what we did as a class, we collected all these passages by reading through the book of Isaiah in 15 minutes. Wasn't that a fun exercise? We all read through the book of Isaiah and we covered it in just 15 minutes. You can do that of all you look for is one thing. And that's what we did. So we're only going to look for the stuff on creation. Skip the rest of it. I know it's interesting, but just skip the rest of it. Only focus on the stuff that does with creation. And yeah, it was a fun exercise. We broke up in the groups and everybody was able to finish in 15 minutes. And so kind of a good Bible exercise. Pick a precise topic and go through a long passage quickly. Yes, John? Well, the word is a rest. And you know, it's like almost every Hebrew noun in the Old Testament is multiple literal definitions. And in this case, it's got five distinct definitions. It can mean something as small as your backyard. It can mean something as big as the whole universe. And it can mean the whole of the earth or part of the earth. So yeah, it's got multiple definitions. And typically you'll look at the context to see which it is. Holy, holy, holy, as the Lord of hosts, as glory fills the whole earth, basically making a point, every part of God's creation reveals God's glory. So even something like a cockroach, if you study it, reveals the glory of God. Mosquito reveals the glory of God. So that's the kind of little thing you can think about next time you're hiking in a place where the mosquitoes are biting you. And keep in mind, only six of the nearly 300 species of mosquitoes actually bite human beings. But yeah, there seems to be a lot of them here in California. So the Lord of hosts is sworn, as I have purpose, so will be as I have planned it, so will happen. And what we drew out of this, there are no accidents or random outcomes. Things might look random to us. And we talked about that, how physics actually critically depends on things being unpredictable and random. But from God's perspective, there's nothing accidental, nothing random. Every outcome, every event in the history of the universe, the earth and earth's life plays a role in making possible the fulfillment of God's purpose, which is bringing into a redeemed relationship billions of human beings in a short period of time. The Lord of hosts Isaiah 14 27 himself has planned it. Therefore, who can stand in its way? It is his hand that is outstretched. So who can turn it back? Nothing stands in the way of God's purposes and plans. Whatever his plan and purpose, it will happen. Nothing can afford it. Satan can't afford it. We can't afford it. It's going to happen. So don't worry about the evil of human beings being committed. Don't worry about who's leading our country or who's leading other countries. God has it all under control. His purpose will be fulfilled. The Lord of hosts Isaiah 37 16, God of Israel, who's enthroned above the cherubim. That's the leading angels. You were God, you alone of all the kingdoms of the earth. You made the heavens and the earth. God is the only agency of creation. There is no other factor. Last week we had skeptics forum and I was encouraged both the Sunday morning and the Monday evening. We had Jewish believers come here and we had some interesting discussions with them, both publicly and privately. But you know part of Jewish theology is that the angels participate in creation. You say where do you get that from? Well, if you pick up a Jewish Bible, you'll note that it has footnotes, particularly when you look at Genesis 1. Because in Genesis 1, it talks about Elohim as the creator, the one who's both singular and plural. And it talks about God creating human beings. And it says God created man in his image. In our image, we created him. So in two sentences back to back, God uses plural pronouns for himself and singular pronouns for himself. And we who are believers in Jesus Christ say, well, that's the doctrine of the Trinity, is that the Father participates in creation, the Son participates in creation, and the Holy Spirit participates in creation. And that's what's being communicated to us in Genesis 1. But yeah, I was talking with one of the Jews that visited our skeptics forum last week, and he was saying, well, we Jews believe it's the royal we. And so when God's using the plural pronouns in Genesis 1, that's referring to himself and the angels. And they kind of work as a team to bring about this creation. But that runs into a problem with this text. Because this text is making, by the way, this isn't the only text. This is repeated throughout the book of Isaiah. There's only one who creates. No one else plays a role in creation, except God. God alone is the Creator. And as we're going to see, the book of Isaiah talks about three distinct persons that participate in creation. Yet it says there's only one Creator. Because we're going to find out it's the book of Isaiah that says the most about the doctrine of the Trinity. And yeah, a Jewish friend of mine in South Africa, he became a Christian through reading the Isaiah text as rabbis told them not to read. The ones were actually studying. And he looked at that and says, wow, the Christians are right. God really is a triune. It helped that he was a scientist, because as I've mentioned here in the class, science really only makes sense that God is triune. I see that Dave is standing up, which means I'm out of time. That's fine. God is the only agency of creation. There is no other factor. The angels don't participate. God and God alone participates in creation. Because we're going to see it's a God that manifests in three persons. We're all three are involved in creation. And notice you actually see a hint of that in Genesis 1. It's the spirit that hovers over the surface of the water as the planet earth. And then it uses the plural pronoun, making the point there's more than one person involved in creation. And we're going to have to pick this up next week. We're going to be jumping into chapters 40, 41, 42. It's chapters 40 to 48 in the book of Isaiah that actually tells us the most about how God creates the universe. But yeah, it's also going to make the point that God alone and no other person is involved in creation. Incidentally, this also impacts Christian theology. There's some Christians who actually think that Satan took a hand in trying to create, didn't do a very good job. But these are texts that point out, Satan doesn't have that power. Only God has the power to create God and God alone. Father in heaven, we thank you for this time we've had in your book, Isaiah. We thank you for being alive in the 21st century when so amazing discoveries in your book of nature are revealing you like they've never revealed you before. And Father, pray you give all of us a sense of gratefulness for the magnificent and the extent of what you've done in this universe and our planet and planet's life to make possible in existence today, to make possible billions of us to be here with the technology that we can hear the good news of salvation through Jesus Christ and respond. We thank you Lord that you've created in such a way that this can all be happened in a very brief period of time. Where we can look forward to a far better life and a far better creation once you eliminate evil and suffering once and for all. And Father, I pray you to equip us to be able to share this with people who yet don't know you as Creator, Lord and Savior in Jesus' name. Amen. Hold your seat. One second. I'll turn my mic off. I'll just speak loudly. As I step down, because I've been here for ten years, because of the love you've shared to me, I'm already getting feedback. I really appreciate your love for me. I really appreciate your love for me. What I want to make sure is that that hurt doesn't turn into bitterness. Bitterness never produces any fruit to let you know I'm stepping down on my own accord. You know, Josh didn't ask me to step down. Hugh didn't ask me to step down. Nobody asked me to step down. I just, I had, you know, lots of things in my life where the Lord just was telling me it's time to close the door and to move on. And if you love me and if you miss me, you know, that's fine. But don't let that turn into bitterness. Bitterness doesn't belong in the church.  It's okay to be sad and climb out of that sadness. I've had opportunities, obviously to serve you like I never would have dreamed, you know. If, you know, if somebody would ask me 10 years ago, if I had been memorial services for family members that have passed away in this class, I've never would have dreamed it. And so the Lord has opened so many doors and blessed me so many different ways. But the Lord, as I said, I've just seen enough simple signs in my life that I need to close the door in this life. But because I've been here for 10 years, and any pastor that leaves or elder or any believer that leaves after 10 years, there's a tendency, obviously, you know, to have that sadness turn into bitterness. And so I want to pray one more time. Yeah, you get you take you take the microphone. Yeah. Is that, you know, Dave here is the fourth person we've had moderate this class. So yeah, 10 years is kind of the average. So and, you know, we do need to let people take a break once in a while. And I really appreciate it. If you love me, let me have a break. Yeah. So thank you for your 10 years of service. It's been remarkable. And incidentally, we're not trying to recruit you for 10 years of service. So if you want to serve for one year, I will accept that. If you want to serve for, you know, 10 years, that's okay too. But it's interesting that's been the average for this class has been about 10 years. So I don't know how old I'm going to be when the eighth one comes here. But I also appreciate the fact that Mark back there has been very good at making sure that when I'm gone, when I'm speaking elsewhere in the country in the world, there's people here that can provide really excellent teaching. So all of us have backups. And that's one thing I'm looking forward to is we try to develop the leadership team here is we do it in such a way where all of us have backups. Because, you know, sometimes I might need a break for a few weeks, like I actually plan to take a vacation this summer. So and you know, I think about Helen here, she might want to take a vacation once in a while. And so that's what I'm looking forward to is that, yeah, we're going to have leaders here, but the leaders are going to each have a team, which means we're going to have to recruit a whole lot more of you to be part of the service and the leadership here. So thank you. And then to let you know my new title, so I'm no longer the class leader, class coordinator. I have one title, one title alone that's class trainer. And so I need to pass on what I'm doing to other people so that there's not a gap in ministry. And I definitely don't want it to have a dip in ministry. We built up this ministry. We're reaching the world for Christ. I want to see that continue. So my new, I forgot to mention that my new title, obviously, what is my new title? And my title is class trainer because I've obviously done all the ministries that are in this class. So when people are absent, obviously I have to fill in. And so as such, I know each one of the ministries and will be training new volunteers. And so that's my new title. So I won't be totally disappearing. I'll be training new people so to make sure that we have a smooth transition. But once again, I've already had a couple people come to me and crying and saying, Dave, you know, and I just want to make sure again that that sadness does never turn to bitterness.  It's okay to be sad, but from there we must climb forward. And I've been very touched by the things that I've said. I will be here after class if you'd like to talk to me one-on-one. And so that would be great.  Dear Lord, we just thank you for your grace and your mercy, Lord. We thank you that it's new every single morning. Whatever disappointments or hurt or pain comes into our life. We're so thankful that you can fill our cup every morning to help us to get through our day. And we thank you, Lord. You know that we are not perfect, which is why you send your Savior, Jesus. You knew we didn't need a great speaker. You know we didn't need a philosopher or an engineer. You knew that in the deepest part of our hearts we need forgiveness. And so you sent your Son to be our Savior. May he fill our cup every single day full of joy and mercy, whether we're at a peak of happiness or in the pit of despair. And you're always there with us. We're so very thankful for this class and the opportunities to participate with you in reaching the world with your love and your gospel and being able to see your love and power in creation. Bless us, we pray. Until next week, amen.


We had presentations on performance. Then we had a presentation of the future. And I'm going to talk to you a little bit about the future of performance. Admire the transition. So this presentation is about the JavaScript binary AST. I'm going to give details about what that means. But what is it? It's a proposal for the future of JavaScript. It's a new technology that we are currently developing at Mozilla and Bloomberg and Facebook to speed up loading up web pages in the not so distant future. So it's great. The web is fast. We keep improving the web. We keep making it faster. But of course there is no such thing as fast enough. We have pretty fast JavaScript engines these days. JavaScript is fast enough to run video games, which is a few years ago who would have said that it would be possible. However, sometimes the performance of JavaScript is not sufficient for several reasons. But one of them is look at how much data you're loading when you are opening Google Sheets or Google Docs or Yahoo or LinkedIn or Facebook. All of them just before they can do anything useful load at least three megabytes of compressed JavaScript code. So much more if you decompress it. We have noticed several of them that load something like seven megabytes. And the compressed size can go up to 40 megabytes. Imagine loading 40 megabytes of code in your browser whenever you start your application. You don't do this with your desktop applications, your native applications. And to make things worse, these websites are dated very often. It's usually not the scale of every five minutes, but sometimes it happens. So imagine that is going to wreak havoc on the whole infrastructure of your browser, your caching, all of that. You just need to find a way to cope with this level of JavaScript. Because one of the consequences is it's very slow to start. If you recall what Florent was saying earlier, was it 100 milliseconds, 200 milliseconds that people start thinking it's broken? 500. Okay, so just parsing the JavaScript for Facebook is already at least 500 milliseconds on both Chrome and Firefox. That's parsing. That's once you have received the JavaScript, once you have received the HTML, once you have received the images, the CSS, you start parsing the JavaScript at some point. And after you've finished parsing the JavaScript, you have a few more steps which I'm going to detail soon. And only then can you start having an interactive page. So that's for the chat of Facebook. So this means that for the first few seconds, actually, of Facebook's chat, you cannot do anything. So what's Facebook doing against this? They're doing what we are doing. They're trying to optimize stuff, and they're trying to use tricks to make it look faster. Which means, unfortunately, these tricks, once you have too many of them, it actually makes things go slower, just to make them look faster. And the problem is that things are only getting worse from here. A few years ago, when you were writing JavaScript code, or web application, you were hand-rolling, and you had a few hundred, worst case, a few thousand lines of code. Nowadays, you're using Webpack to pack how many frameworks, how many modules, 40 modules, 70 modules.  And there is no reason to stop that, because modules are good, frameworks are good, or at least when they're providing something useful, yes, use them. But the browser needs to be able to cope with that. Unfortunately, bring this a little bit more, and we have exactly the problem that was described earlier. It looks broken. So, I'm saying that loading JavaScript is becoming too slow because of the amount of JavaScript. Let's take a look at why loading JavaScript is too slow. Loading JavaScript is basically the same thing as loading other programming languages. It's a bit different because you're loading it from your browser, but still generally the same outline. You grab the source code, you decompress it, because you typically receive compressed.  All of these steps are typically relatively simple in a programming language. Would that that it were so simple for JavaScript? Because JavaScript is actually pretty complicated language. So, let's start with the beginning. You are opening a web page. Let's assume you already loaded the HTML and I think that's going to load your JavaScript. Okay, now you can download the source code, your JavaScript source code. You can decompress it. This is the web, so any encoding is accepted, except you're not going to write an interpreter for every single encoding, so you typically need to convert your encoding to something that your JavaScript virtual machine can understand. That's already going to take some time and allocate some memory for people who are performance sensitive. Then you tokenize. I don't know how many of you are familiar with tokenization, but tokenization is one of the first steps you do when you're trying to interpret or compile a programming language. You take your source code above and you convert it to a series of tokens. So, this source code is function foo something, so the function here is translated to this token, foo is translated to token that says it's an identifier, then we have a left parenthesis, we have another identifier, right parenthesis, et cetera. That's how every single interpreter or compiler on Earth works. Problem is that not all of these interpreters or compilers are doing JavaScript because JavaScript is not such a simple programming language. For instance, if I see foo, what is foo in JavaScript? It's typically a keyword, except sometimes it's not. You cannot have a variable called foo, but you can have a field called foo. So, it doesn't know what token to use here. If it encounters a slash, the slash is a nightmare. What's a slash? Is it a division? Is it the start of a single line comment? Is it the start of a multi-line comment? Or is it a reg exp? Good luck knowing that. The tokenizer has no way of knowing that. Oh, nice one, too. Use strict. If it was any other string, it would be a string, except it's use strict. So, it's actually not exactly a string. It's a directive. And a directive is going to change how the parser works. And there are more complicated things, such as strings themselves are pretty hard to parse or to tokenize because we want to be able to deal intelligently with every single language on Earth, and not all languages use the same bytes to represent the strings. And if we want to save memory, we want to be smart about this. Being smart about it means that we need to analyze every single string. Every time we encounter a string, this includes every time we encounter an identifier, which means things slower. So, the answer to all of these questions is, it depends. In other words, yeah, tokenization is hard. You're going to see that guy again. The next step, once you have tokenized, is to parse. So, that was what we have produced in the previous step. We have something that says it's a function, and then there is an identifier, so a name foo, and more stuff. And then you want to produce something that basically looks like that. This is what the interpreter or the compiler is going to have in memory to do anything, to do security checks, safety checks, security checks, to generate byte code, to optimize your code, to reject the code because features are not available, et cetera. So, from this, it's going to deduce that this is where declaring a function. It's not asynchronous. It's not a generator. Let's not talk about scope. It has a name called foo. It has arguments. So, a single argument called x. And, okay, the body... I don't have enough space to put the body on that slide. Nor, on other sites, be reassured. You will not have to read this data structure too often. Is it easy? I can assure you. I'm pretty sure you already guessed the answer. No, it's not going to be easy. So, let's look at this simple example. Can anyone tell me what's the return of this function is going to be if I put true for this argument? So, I put x equals 20, and I return x plus 10. And the answer is, of course, it depends. K is 1. The one that you probably assumed you have when you looked at the source code because I had hidden the annoying part. Yeah, that's 20. Yeah, 10 plus 10 equals 20. So far, so good. Second case, I've added something in my comments here. I really cleared variable x after having returned it, but who cares? And suddenly, this function returns, oh, that's not a number. Yes, exactly, because of the hoisting. So, we can detail all the reasons for which this happens, but the summary is parsing is not that easy. So, handing variables is one of the many reasons for which parsing is not easy, and parsing is slowed down a lot by these kind of things. If you're having fun with this, handing this in JavaScript, don't worry if the compiler or the interpreter is also having lots of fun trying to understand what the heck is that this? Evil. Evil is even more evil if you know how it works. So, fun fact, there are actually four different definitions of evil in the specifications of the JavaScript language, depending on the context. And some of them change the meaning of variables. Okay, same thing with will. If you have used strict syntax rules, are not the same ones? Fun. And just to make things a little bit slower, by specification, it's not permitted for the parser to skip anything, because if there is a syntax error, you need to know about it immediately. We're talking about performance. Skipping things would have been pretty cool. They would have. Okay, once you have your nice data structure, which is called an AST, we'll come back to that. Well, you still have a few steps before you can execute. You need to perform some safety checks. Then you generate your bytecode. Every single browser has a bytecode format. And then the bytecode is something that you can execute. Yes! Okay, we have spent those 500 or 900 milliseconds. So those were... That was all that was happening during those 500 or 900 milliseconds. We like to make this faster. So we have all these steps. It would be nice if we could move or parallelize or make faster some of them. Let's see how we can do that. People have tried things. Oh, I didn't put the obvious thing. People have tried to optimize the browser. Yes, we've been doing this for the past 20 years. We have done a pretty good job. I mean, we as a community have done a pretty good job. But again, sometimes it's not sufficient. So what can we do to make things faster? We can make lazy parsers. So parsers that are going to try and be smart enough to sometimes skip things. Every single browser actually does that in practice. In practice, it actually is not that useful. Plus, it actually decreases the total performance. So it makes starting a little bit faster and then it makes the total execution a bit slower. We have recently landed in Firefox, and I think Chrome has landed something similar recently, something called bytecode caching, which is extremely great. The second time you load the same JavaScript, you skip most of the steps I mentioned above. That's insanely cool. There are two cases in which it doesn't work. The first case is the first time you connect to Website because you haven't loaded that JS yet. The second thing is five minutes later when Facebook has updated their JavaScript code, and you need to restart the whole process. So great technology. We're trying to optimize the other cases. People on the development, on the JS Dev team, the JS Dev side have tried to optimize things, of course. Typically, with the use of minimizers, that try to make the source code shorter, or with lazy module loaders. So the first one, minimizers are pretty good at reducing the total size of the file that is being sent. And typically, they actually make parsing slower in our experience. So... So useful in some cases, not a solution, unfortunately, plus they also make the code unreadable. Lazy loaders require refactoring your code. Sometimes they work, and generally they actually make your performance worse also. Plus, once you reach a large enough amount of JavaScript code, lazy loaders are going to be insanely complicated to introduce if you have not built your code from start for that. People have also tried to improve browsers by providing new technologies in the browser that developers can use to make faster stuff. So recently, Wasm, which is great, and works for several use cases, many use cases, but not all of them, because you need to basically write your code in C++, or REST if you're lucky. And there are ideas to use the service workers to improve the loading time of your applications, the loading time of your JavaScript. Of course, you're going to spend your time if you're trying to use this for a website that's updated every five minutes, you're going to spend your time downloading updates and compiling your updates and preparing your updates for execution, which is going to be pretty much as good for the planet as Bitcoin. Not the best solution. Oh, and people are, of course, doing native apps because sometimes, if you want to make things start faster, sometimes the native app is the solution. Our objective here is to provide something that doesn't need you to refactor, doesn't need you to use a native app, and just works. So it's called the JavaScript binary AST. It's a proposal for the JavaScript language. Basically, it's a new file format. Oh, yes, we've been working on this. It's Mozilla, Bloomberg, and Facebook. So it's a new file format. Instead of .js files, you're going to send .binjs files, which are much faster to parse, which are pretty much equivalent. They're not ugly-fied. It's not a bytecode. It's not a new version of WebAssembly. It's not a competition of WebAssembly. It's your usual JavaScript just in a different format. So if you recall, I told you, you would not have to read it many times, but I never said that you would never read it again. So this is our function declaration. So this data structure is what we call an AST, an abstract syntax tree. So it's a tree. It represents the syntax, and it's kind of abstract. We can store it efficiently. We can store it just as this sequence of numbers plus the definition of the string foo above. I skipped a few things. Plus we can compress it afterwards. The whole point of that, well, there are several points. Remember the long lists we had earlier? Well, we can make it shorter. Still need to download, but then we can tokenize parse and check things in a much more efficient way. If we have a good binary format, we can actually skip things and with a few changes to the specification, but if you have the right specification, we can skip things and only read what we need, only tokenize what we need, only parse what we need, only check what we need. Then we generate the bytecode and we execute. Many things are faster. Hopefully the file is smaller. We haven't reached that state yet. We can start all the operations much faster. We don't need to perform as many operations before we start.  It becomes absolutely trivial. And the format is what we call the proof carrying format, which basically means that checking that things are basically safe is much, much, much faster than it used to be. Again, we only parse and check and tokenize the code we execute, which makes it much faster for startup. And we do this without loss of performance by a position to what happened before. We also need to parse all names, all strings, all live variables, et cetera, only once. And we're pretty sure that we can parallelize this much better for modern architectures. So I believe we have a little bit of time for a demo. Thank you. So let's... I've taken the source code of jQuery. So this is jQuery. You don't care. You don't need to read it. It's just jQuery. We compress it above. I don't know if you can read the size, but we divided the size by about six more or less. We can do better. But that's what we have for the moment. Then we can decompress it back, which is actually a bit slower than it should be, but we've not optimized that part yet. And this is the result, which should be more readable in my editor. So things to remember is, okay, we have lost comments. And that's basically the only thing we have lost. And so variable names are here. Layout is a bit different, but it's still understandable. And yeah. So we have a process that we can reverse. So it's a compression format. And that process, that version, the binary version, is much, much faster to load. Last year, we wrote a full proof of concept, full minus security. We had not implemented security for that test. It was just a proof of concept just running on my computer. I didn't care about security because I was the only one using that format anyway. I'm not going to give hard numbers on the speedup, but we had insane speedups with that version. And the file format was really much smaller than minimized plus gzip plus. So we put that into the standardization track. And right now, we are currently writing a third prototype which has the security. The security, again, is easier and faster to check with JavaScript. The source code of this parser is easier to check than the existing parser that is part of Firefox or any competitor. So it's actually harder to make security errors in the parser. It's never impossible, but it's harder. Okay, we're not finished yet. But anyway, it's on the process to be finished and standardized. Our hope is that we'll be able to ship a version for opt-in testers during this summer and try it with a number of large vendors if you want to help. And thank you for listening. So the question is, I mentioned that during parsing we can skip the parts that we're not using yet. And the question is do we need to parse them later? Yeah, of course, the answer is yes, we parse them later, but we only need to reparse the part that we're using. We can parse one function at a time. We can say, hey, let's start at this offset until that offset and just parse that part, which is something that's not possible with text JavaScript. You can try to scream if you want in case somebody hears. Okay, does anyone have a question who's closer? Actually, I went a bit over time, so if you have questions, do not hesitate to ask them afterwards. Thank you for listening.


So this video is solving problems using proportional parts number one. In order to solve this we need to set up proportions and the fact that we have these parallel lines within a triangle tells us we can use proportional parts of a triangle. So three and eight follow the same proportion as x plus two does to twelve. So let's set up our ratios. So now our job is to cross multiply. Three times twelve is equal to eight times the quantity x plus two. Three times twelve is thirty six and then eight times the quantity x plus two. Make sure we use the distributive property. And now we'll subtract ninety six from both sides of the equation. Wait a minute. Ninety six. That's incorrect. Eight times two is sixteen. If we subtract sixteen from both sides then we get eight x is equal to twenty. Dividing by eight on both sides gives you that x is equal to twenty-eighths which both are divisible by four. And so we get five over two is our value of x. Let's take a look at another example. So here we have two variables to solve. Let's deal with variable A first. Since A refers to the entire side length of that triangle we want to figure out the other side length in order to set up our ratios. So ten came from six plus four. So now we have our ratios. We have seven and eight follow the same ratio as four to ten. When you cross multiply we have four times A is equal to seven times ten. And seven times ten of course is seventy. And then we'll divide both sides by four. And that reduces to the fraction A is thirty-five halves. So there's A. Now our job is to also find B. So if we think about this figure as two overlapping triangles. This side the longer side that actually drew blue. I think color coordination would say it should be red. So eight corresponds with B. In the same way that let's say seven corresponds with thirty-five over two. Or maybe an easier one would be eight divided by B equals four divided by ten. So let's set up that ratio. So once again we have four divided by ten is equal to eight divided by B. And then we'll cross multiply. We have four B is equal to eight times ten which is eighty. And then divide by four on both sides. And now we get B is equal to twenty.