No history yet

Introduction to Compiler Design

What is a Compiler?

Computers don't understand programming languages like C, Python, or Java. They only understand machine code, which is a series of ones and zeros. So, how does the code you write get turned into something a computer can actually run? That's the job of a compiler.

A compiler is a special program that translates code written in a high-level programming language into a lower-level language, like machine code, that the CPU can execute.

Think of it like a human translator. Imagine you write a book in English, but your reader only understands Japanese. You'd need a translator to read your entire English book and produce a complete, standalone Japanese version. The compiler does the same thing for your code, creating an executable file (.exe on Windows, for example) that can be run directly by the computer.

Lesson image

Compilers vs. Interpreters

Compilers aren't the only type of translator out there. There's another kind called an interpreter. While they both achieve the same goal of running your code, they work in fundamentally different ways.

An interpreter translates your code one line at a time and executes that line immediately. It's like having a simultaneous interpreter at a conference. As someone speaks, the interpreter listens to a sentence, translates it, and says it out loud. They don't wait for the entire speech to be finished.

A compiler, on the other hand, translates the entire program at once before the program is run for the first time. It scans all your code, checks for errors, and produces a complete, translated executable file. The key difference is when the translation happens.

FeatureCompilerInterpreter
TranslationTranslates the entire program at once, before execution.Translates the program line by line, during execution.
OutputCreates a standalone executable file.Does not create a separate file; it just runs the code.
Execution SpeedGenerally faster, as the translation is already done.Generally slower, as translation happens on the fly.
Error HandlingReports all errors at once after scanning the whole program.Reports the first error it finds and stops execution.

The Journey of Compilation

Compilation isn't a single, magical step. It's more like an assembly line, with the source code passing through several distinct phases. Each phase takes the output from the previous one, processes it, and passes it along to the next. This entire process is often called the "compiler pipeline."

5:`... how does the compiler even start? How does it know that `if` is a special command word, but `x` is a variable name I just made up?"},$R[81]={speaker:"Jo",text:"That is the perfect question, because that's exactly where the first phase, lexical analysis, comes in. It's not magic, it's just very, very methodical. Think of the compiler like a person reading a sentence for the first time."},$R[82]={speaker:"Beau",text:"Okay..."},$R[83]={speaker:"Jo",text:"Before you can understand the grammar or the meaning of 'the cat sat', your brain has to first identify the individual words: 'the', 'cat', 'sat'. You see the letters t-h-e and you group them together into a single unit, 'the'. The lexical analyzer, or 'lexer' for short, does the exact same thing for code."},$R[84]={speaker:"Beau",text:"So it's like the code-word spotter. It takes my big string of text and chops it up into the basic vocabulary of the language."},$R[85]={speaker:"Jo",text:"Precisely. And these 'vocabulary words' have a special name: tokens. The output of the lexer isn't the code anymore; it's a stream of these tokens."},$R[86]={speaker:"Beau",text:"Tokens. Okay, so in my example, `if x > 5`, what are the tokens?"},$R[87]={speaker:"Jo",text:"Great example. The lexer would scan it and produce something like this: first, it sees 'if', and recognizes it as a keyword. So, Token one is `KEYWORD`. Then it sees 'x', which it identifies as a variable name, so Token two is `IDENTIFIER`. Then the greater-than symbol, which is an `OPERATOR`. Then the number '5', which is a `NUMBER_LITERAL`. And it would probably just ignore the space."},$R[88]={speaker:"Beau",text:"Wait, so the token is just the category, like `KEYWORD`? But how does it remember that the specific keyword was `if` and not, say, `for` or `while`?"},$R[89]={speaker:"Jo",text:"Ah, that's the other key piece of the puzzle. Each token has two parts. The token type, which is the category like `IDENTIFIER`, and the lexeme... which is the actual string of characters it found. So the first token is really (`KEYWORD`, 'if'). The second is (`IDENTIFIER`, 'x'). The third is (`OPERATOR`, '>'). The lexer passes both pieces of information along."},$R[90]={speaker:"Beau",text:"Okay, that makes so much more sense. The token is the 'what it is,' and the lexeme is the 'what it says.' So, how does it know the rules? How does it know that `my_var` is a valid identifier but `99bottles` isn't, in most languages?"},$R[91]={speaker:"Jo",text:"It knows because we give it a set of patterns. And these patterns are defined using a beautifully powerful tool called regular expressions."},$R[92]={speaker:"Beau",text:"Oh man, regex. I've seen those... they look like a cat walked across the keyboard. All those weird slashes and brackets."},$R[93]={speaker:"Jo",text:"They can look intimidating, but they're just a formal way of describing a text pattern. For example, the pattern for a variable name... an identifier... might be 'a letter, followed by any number of letters, numbers, or underscores.' There's a specific regular expression that describes that exact rule."},$R[94]={speaker:"Beau",text:"And that's why `99bottles` would fail, because it starts with a number, which violates the 'must start with a letter' part of the pattern."},$R[95]={speaker:"Jo",text:"Exactly. So you feed the lexer a list of these regular expression patterns, one for each token type: one for keywords, one for identifiers, one for numbers, one for operators, and so on. When it's scanning the code, it tries to find the longest possible string of characters from its current position that matches one of those patterns."},$R[96]={speaker:"Beau",text:"The longest match... what happens if something could match two patterns? Like, what about the word `if`? It matches the pattern for a keyword, but it also matches the pattern for an identifier... right? It's a letter followed by another letter."},$R[97]={speaker:"Jo",text:"That's a classic problem. The rule is usually priority. You list your patterns in order, and the lexer gives precedence to the one that comes first. So you'd put all your specific keywords, like 'if', 'else', 'for', 'while', at the top of the list. Then, further down, you'd have the more general pattern for any other identifier. The lexer sees 'if', checks its list, finds a match on the `KEYWORD` pattern first, and stops looking."},$R[98]={speaker:"Beau",text:"So it's a race, and the keywords get a head start. Got it. So behind the scenes, how does this pattern matching actually work? Is it just a bunch of if-statements?"},$R[99]={speaker:"Jo",text:"You could try to write it that way, but it would be a nightmare. The elegant solution is that each regular expression can be converted into a very simple theoretical machine called a finite automaton."},$R[100]={speaker:"Beau",text:"A finite... what now?"},$R[101]={speaker:"Jo",text:"Finite Automaton. It sounds complex, but the idea is simple. Imagine a machine with a handful of states, like different rooms. And there are paths between these rooms labeled with characters. You start in the 'start' state. You read the first character of your code, say it's 'i'. You follow the path labeled 'i' to a new state. Then you read the next character, 'f', and follow the path labeled 'f'. If you end up in a special 'accepting' state, the machine says 'Yes! I recognize this!'"},$R[102]={speaker:"Beau",text:"So it's like a flowchart for recognizing a word. And if I type 'ig', it would follow the 'i' path, but then get stuck because there's no 'g' path out of that room, and it would fail."},$R[103]={speaker:"Jo",text:"Exactly that. It's incredibly efficient. And the best part is, we don't even have to build these machines by hand. There are tools for this. The most famous one is called Lex, or a more modern version, Flex."},$R[104]={speaker:"Beau",text:"Lex, as in L-E-X?"},$R[105]={speaker:"Jo",text:"Yep. You just write a file that contains your list of regular expressions and what to do when each one is matched. You feed this file to Lex, and it automatically generates all the C code for a super-fast, efficient lexical analyzer based on those finite automata we just talked about. You don't have to worry about the low-level implementation."},$R[106]={speaker:"Beau",text:"So it's a lexer generator. That's pretty cool. You just provide the recipe, and it bakes the cake."},$R[107]={speaker:"Jo",text:"That's a great way to put it. You're defining the vocabulary of your language. This whole process is so fundamental because it cleanly separates the problem of 'recognizing words' from the next phase, which is 'understanding sentence structure.' The lexer just creates the stream of tokens, this clean, organized list of ingredients, and hands it off. It doesn't know what they mean together; it just knows what they are individually."},$R[108]={speaker:"Beau",text:"So it's the foundation for everything that comes after. If the lexer gets it wrong, the whole rest of the compiler is just... completely lost."},$R[109]={speaker:"Jo",text:"Completely. It would be like trying to understand a sentence where all the words are spelled incorrectly. The next stage, the parser, wouldn't stand a chance."}]},$R[110]={type:"podcast",title:"Syntax and Semantic Analysis",nodeId:"whiqzq",audioUrl:"https://oboe-storage.s3.amazonaws.com/dev/podcasts/v1/node-484632/feb59c5c-2fdb-4f83-ad60-320af6dd773a.m3u8",episodeVariant:"full",scriptParts:$R[111]=[$R[112]={speaker:"Beau",text:"Okay, so last time we talked about lexical analysis, right? The compiler scans the code and chops it up into these little meaningful chunks called tokens. Like… we have a variable name, an equals sign, a number… all lined up."},$R[113]={speaker:"Jo",text:"Exactly. A stream of tokens. But the compiler doesn't know if that stream actually makes sense yet. It's just a pile of words, grammatically speaking."},$R[114]={speaker:"Beau",text:"So… what happens now? Does it just start trying to understand them in that order?"},$R[115]={speaker:"Jo",text:"That's the next phase: syntax analysis, or as most people call it, parsing. Its job is to check the grammar. It takes that stream of tokens and sees if they're arranged according to the language's rules."},$R[116]={speaker:"Beau",text:"Ah, okay. So it’s like in English, I can have the words 'dog', 'the', and 'bites'. Lexical analysis gives me those words. Syntax analysis checks if I wrote 'the dog bites' and not 'dog bites the'."},$R[117]={speaker:"Jo",text:"Exactly. Or 'bites the dog'. The structure has to be correct. And the way the compiler knows the correct structure is through something called a context-free grammar."},$R[118]={speaker:"Beau",text:"That sounds… intimidating. Context-free grammar."},$R[119]={speaker:"Jo",text:"It's just a fancy term for a set of rules. Think of it like a recipe book for building valid statements in a programming language. A rule might say 'an if-statement must have the keyword IF, followed by a condition in parentheses, followed by a block of code in curly braces'."},$R[120]={speaker:"Beau",text:"Got it. So the parser is just checking our code against this recipe book. And if you forget the parentheses, it throws a syntax error because it doesn't match any of the recipes."},$R[121]={speaker:"Jo",text:"Precisely. And as it successfully matches these rules, it builds a structure called a parse tree, or an Abstract Syntax Tree, an AST."},$R[122]={speaker:"Beau",text:"A tree? Like a family tree?"},$R[123]={speaker:"Jo",text:"Kind of. It’s more like those sentence diagrams you did in grammar school. You know, where you'd draw the sentence and break it down into nouns, verbs, adjectives, and show how they all connect? The parse tree does that for code."},$R[124]={speaker:"Beau",text:"Okay, that I can picture. So if the code is `x = 5 + 3;`, the tree would have the equals sign at the top, with 'x' on one side and the plus expression on the other. And that plus expression would branch out to 5 and 3."},$R[125]={speaker:"Jo",text:"You've got it. That tree represents the grammatical structure of the code. It's the main output of the parsing phase. Now, how it *builds* that tree… there are different strategies, like LL and LR parsing."},$R[126]={speaker:"Beau",text:"More acronyms. Of course."},$R[127]={speaker:"Jo",text:"They're just names for two different approaches. Think of it like reading a sentence. LL parsing is like reading from left-to-right and trying to predict what kind of phrase is coming next based on the very next word. It's a top-down approach."},$R[128]={speaker:"Beau",text:"Okay, so it sees an 'if' token and it immediately thinks, 'Okay, I'm now expecting to see an open parenthesis'."},$R[129]={speaker:"Jo",text:"Exactly. LR parsing is the other way around. It's bottom-up. It reads along, finds a sequence of tokens that matches a complete rule—like `5 + 3`—and says, 'Aha! That's an expression!' and then collapses it into a single 'expression' node, and keeps going."},$R[130]={speaker:"Beau",text:"So one tries to build the tree from the root down, the other from the leaves up."},$R[131]={speaker:"Jo",text:"Perfect analogy. LR is generally more powerful, it can handle more complex grammars, but it's also harder to write by hand. Most modern compilers use some form of LR parser. So, at this point, we have a beautiful parse tree. The code is grammatically correct."},$R[132]={speaker:"Beau",text:"Great! So we're done, right? It knows what to do."},$R[133]={speaker:"Jo",text:"Not quite. Just because a sentence is grammatically correct doesn't mean it makes sense."},$R[134]={speaker:"Beau",text:"What do you mean?"},$R[135]={speaker:"Jo",text:"Well, the classic example from linguistics is 'Colorless green ideas sleep furiously'. Grammatically, it's a perfect sentence. Adjective, adjective, noun, verb, adverb. But it's complete nonsense. It has no meaning."},$R[136]={speaker:"Beau",text:"Ah, okay. I see. So the code can be structured correctly, but still be trying to do something impossible."},$R[137]={speaker:"Jo",text:"Exactly. And that brings us to the next phase: semantic analysis. This is where the compiler checks for meaning. It walks that parse tree we just built and asks questions."},$R[138]={speaker:"Beau",text:"Like what kind of questions?"},$R[139]={speaker:"Jo",text:"The big one is type checking. If your code says `5 + \"hello\"`, the syntax is fine: number, operator, string. But does it make sense to add a number to a piece of text? The semantic analyzer says no, that's a type error."},$R[140]={speaker:"Beau",text:"Right, the classic 'cannot add integer to string' error. That's semantic analysis at work."},$R[141]={speaker:"Jo",text:"It is. Another thing it does is scope resolution. Let's say you declare a variable `x` inside a function. Then, outside that function, you try to use `x`. The syntax might be fine, but the semantic analyzer knows that `x` only exists within that function's scope. It'll say 'undeclared variable x'."},$R[142]={speaker:"Beau",text:"So it's basically the context checker. It's not just looking at one line, it's looking at the whole program to see if variables were declared before they're used, if types match up, if you're calling a function with the right number of arguments…"},$R[143]={speaker:"Jo",text:"That's a perfect way to put it. It enriches the parse tree with all this semantic information, this context. So after this phase, we have a program that is not only grammatically correct but also logically sound and meaningful, according to the rules of the language."},$R[144]={speaker:"Beau",text:"So syntax is the grammar, and semantics is the meaning. And you can't have one without the other for code to actually work."},$R[145]={speaker:"Jo",text:"Now you've got the full picture. These two phases work together to make sure the source code is valid before the compiler even thinks about turning it into machine instructions."}]},$R[146]={type:"podcast",title:"Intermediate Code Generation",nodeId:"10chmm8",audioUrl:"https://oboe-storage.s3.amazonaws.com/dev/podcasts/v1/node-484634/69a2419d-363f-4b9c-8eb6-92849b36d309.m3u8",episodeVariant:"full",scriptParts:$R[147]=[$R[148]={speaker:"Beau",text:"Okay, Jo, so last time we walked through syntax and semantic analysis. The compiler has basically checked our code, made sure it's grammatically correct, and that all the types match up. It's built this... this thing, the parse tree. So... what now? Do we just translate that tree into the ones and zeros the computer understands?"},$R[149]={speaker:"Jo",text:"You'd think so, right? It seems like the most direct path. But, uh, compilers almost never do that. They add an extra step in the middle, a really crucial one called Intermediate Code Generation."},$R[150]={speaker:"Beau",text:"An intermediate step? Why? That just sounds... inefficient. Why add a middleman if you don't have to?"},$R[151]={speaker:"Jo",text:"It's a great question, and it's all about modularity and... translation, really. Think of it like this. Imagine you're a UN translator. You know English and you need to translate a speech into Japanese, French, and Spanish."},$R[152]={speaker:"Beau",text:"Okay..."},$R[153]={speaker:"Jo",text:"You could translate directly from English to each of those. But what if, tomorrow, they add German and Russian? Now you have to start from scratch, translating the original English speech all over again. The intermediate code is like creating a... a universal, simplified 'idea-language'. First, you translate the English speech into this super simple, unambiguous language. Then, you can easily write translators from that simple language into Japanese, French, Spanish, or whatever else comes along."},$R[154]={speaker:"Beau",text:"Ah, I see. So the 'English' is our source code, like Python or C++. And the 'Japanese' or 'French' is the machine code for different computer architectures... like an Intel chip versus an ARM chip in a phone?"},$R[155]={speaker:"Jo",text:"Exactly! The front-end of the compiler, all that lexical and syntax analysis stuff, just has to worry about turning one source language into this one, common intermediate language. And the back-end just worries about turning that intermediate language into machine code for a specific target. You can mix and match them. It's hugely powerful."},$R[156]={speaker:"Beau",text:"So what does this... 'idea-language' actually look like? Is it one specific thing?"},$R[157]={speaker:"Jo",text:"Not really, there are a few different forms, or representations. Actually, one of them is something we've already talked about: the Abstract Syntax Tree, or AST. The parse tree from the last step is a type of high-level intermediate representation."},$R[158]={speaker:"Beau",text:"Wait, so we've already made it? Why do we need another step if the parse tree *is* the intermediate code?"},$R[159]={speaker:"Jo",text:"Because the tree is great for showing structure and hierarchy, but it's not great for... optimization. Or for translating into a linear sequence of instructions, which is what machine code looks like. For that, we usually translate the tree into a more machine-like, but still platform-independent, format. The most common one is called three-address code."},$R[160]={speaker:"Beau",text:"Three-address code. Okay, that sounds specific. Why three addresses?"},$R[161]={speaker:"Jo",text:"It means that each instruction has at most three 'addresses' involved. An address can be a variable name, a constant, or a temporary variable the compiler creates. The general form is something like 'result equals operand one, operation, operand two'."},$R[162]={speaker:"Beau",text:"Okay, that's a bit abstract. Grounding rule. Give me a mental movie."},$R[163]={speaker:"Jo",text:"Right. Okay. Imagine your source code is a single line: `x = a + b * c`. It's simple, but it has two operations: a multiplication and an addition. A machine can't do both at once. Three-address code breaks it down."},$R[164]={speaker:"Beau",text:"Following."},$R[165]={speaker:"Jo",text:"First, the compiler would look at the parse tree for that expression and see that, because of precedence rules, `b * c` has to happen first. So it generates a line of three-address code. It creates a temporary variable, let's call it `t1`. The first line is: `t1 = b * c`. See? Result `t1`, operand `b`, operand `c`."},$R[166]={speaker:"Beau",text:"Okay, that makes sense. One simple operation per line."},$R[167]={speaker:"Jo",text:"Exactly. Now the original expression is effectively `x = a + t1`. So the next line of three-address code is just that: `x = a + t1`. And we're done. We've translated one complex line of source code into two very simple, explicit instructions."},$R[168]={speaker:"Beau",text:"And the compiler generates these temporary variables, the `t1`s, automatically as it walks through the parse tree?"},$R[169]={speaker:"Jo",text:"Precisely. It traverses the tree, and for each node that represents an operation, it generates one of these simple three-address instructions. It's a very methodical process. By the end, you have a long, flat list of these simple instructions that are equivalent to your original program."},$R[170]={speaker:"Beau",text:"So, just to recap the benefits of doing all this... First, it makes the compiler modular. You can plug a new language front-end into an old machine back-end. What's the other big advantage?"},$R[171]={speaker:"Jo",text:"The other huge advantage is that this simple, uniform list of instructions is much, much easier to optimize than the original source code or the complex parse tree. The next phase, code optimization, which we'll get into later, works almost exclusively on this intermediate representation. It can reorder instructions, eliminate redundant calculations... all sorts of clever tricks to make the final program faster."},$R[172]={speaker:"Beau",text:"So the intermediate code isn't just a bridge, it's also a... a workbench. It's where the compiler does its fine-tuning before producing the final product."},$R[173]={speaker:"Jo",text:"That is a perfect analogy. It's a well-lit, organized workbench, where every tool is a simple instruction, making it easy to see where you can make improvements, before you commit to building the final, complex machine code."}]},$R[174]={type:"podcast",title:"Code Optimization",nodeId:"10inf3d",audioUrl:"https://oboe-storage.s3.amazonaws.com/dev/podcasts/v1/node-484636/22cf8ea1-d52b-40af-8c8a-718b8e9fb029.m3u8",episodeVariant:"full",scriptParts:$R[175]=[$R[176]={speaker:"Beau",text:"Okay, Jo. So last time we talked about getting our nice, clean source code into this… intermediate code. This sort of generic, in-between language. It feels like we're so close. Can we just... translate that to machine code and call it a day?"},$R[177]={speaker:"Jo",text:"We *could*. We absolutely could. And it would run. But it would be like getting driving directions from point A to point B without asking for the fastest route. The directions would work, you'd get there, but you'd probably sit in a ton of traffic and take a bunch of weird side streets."},$R[178]={speaker:"Beau",text:"Ah, okay. So this next step, code optimization, is basically the compiler's version of Google Maps finding a better route?"},$R[179]={speaker:"Jo",text:"Exactly. It takes that functional but clunky intermediate code and tries to make it smaller, faster, or more energy-efficient without changing what it actually *does*. The output has to be identical, just... better."},$R[180]={speaker:"Beau",text:"Okay, 'better' seems pretty subjective. What's the first thing it looks for? The low-hanging fruit of bad code?"},$R[181]={speaker:"Jo",text:"One of the simplest is something called constant folding. It's... it's just doing math at compile time instead of at runtime. Imagine you wrote a line of code like, `let circumference = 2 * 3.14 * radius`."},$R[182]={speaker:"Beau",text:"Right, a classic formula."},$R[183]={speaker:"Jo",text:"Well, the compiler looks at `2 * 3.14` and says, 'Hey, I know what that is. That's always `6.28`.' So it rewrites the intermediate code to be `let circumference = 6.28 * radius`."},$R[184]={speaker:"Beau",text:"So it just… pre-calculates it? So the computer doesn't have to do that multiplication every single time the program runs?"},$R[185]={speaker:"Jo",text:"Precisely. It's a tiny change, but if that line is inside a loop that runs a billion times, you've just saved a billion unnecessary multiplications. You folded the constants together."},$R[186]={speaker:"Beau",text:"Okay, that makes a ton of sense. It seems so obvious. What else? What about code that just... doesn't do anything?"},$R[187]={speaker:"Jo",text:"That's another classic: dead code elimination. It's exactly what it sounds like. The compiler looks for code that can never possibly be executed."},$R[188]={speaker:"Beau",text:"Like... code after a `return` statement in a function?"},$R[189]={speaker:"Jo",text:"That's the textbook example. Or a condition that's always false, like `if (false) { doSomething(); }`. The compiler is smart enough to see that `doSomething()` will never be called, so it doesn't even bother including it in the final machine code. It just gets erased."},$R[190]={speaker:"Beau",text:"So it's like Marie Kondo for your code. If it doesn't spark joy, or in this case, actually run, you thank it and throw it away."},$R[191]={speaker:"Jo",text:"That's a perfect analogy. The goal is a smaller, cleaner executable. Less code means a smaller file size and fewer instructions for the CPU to potentially load into memory, which is faster."},$R[192]={speaker:"Beau",text:"Okay, so we're doing basic math, we're throwing away useless code. What about the really heavy-hitting stuff, like... loops? You mentioned those can run a billion times."},$R[193]={speaker:"Jo",text:"Right, loops are a huge target for optimization. One common technique is called loop-invariant code motion."},$R[194]={speaker:"Beau",text:"That's a mouthful. Break it down."},$R[195]={speaker:"Jo",text:"Okay, imagine you have a loop that goes from 1 to 100. And inside that loop, you have the calculation `x = y * z`. Now, if `y` and `z` don't change inside the loop... why are you calculating their product 100 times?"},$R[196]={speaker:"Beau",text:"You wouldn't. Or you shouldn't. You'd just calculate it once before the loop starts."},$R[197]={speaker:"Jo",text:"Exactly! That's loop-invariant code motion. The compiler identifies that the calculation `y * z` is 'invariant'—it doesn't change—and 'moves' the code outside, just before the loop begins. So it happens once, not 100 times."},$R[198]={speaker:"Beau",text:"It's amazing how much of this is just... common sense, but applied systematically by a machine. It sounds like there's no downside. Why wouldn't you just optimize everything, always, to the maximum?"},$R[199]={speaker:"Jo",text:"Because there's a trade-off. A big one. The optimization process itself takes time and memory. Remember our Google Maps analogy?"},$R[200]={speaker:"Beau",text:"Finding the fastest route."},$R[201]={speaker:"Jo",text:"Right. But it takes Google Maps a few seconds to analyze all the traffic data and calculate that best route. The compiler is doing the same thing. More aggressive optimizations mean a much longer compilation time. The compiler has to do more analysis, more rewriting... it's a lot of work."},$R[202]={speaker:"Beau",text:"So if I'm a developer just testing a small change, I don't want to wait five minutes for the world's most optimized code. I want to compile it in two seconds and see if it works."},$R[203]={speaker:"Jo",text:"Exactly. That's why compilers have optimization levels. Like `-O0` for 'no optimization', which is super fast to compile. Then you have `-O1`, `-O2`, `-O3`, each one doing more and more complex optimizations, taking longer to compile, but producing faster runtime code."},$R[204]={speaker:"Beau",text:"So you'd use a low optimization level for your day-to-day development, and then when you're ready to ship the final product, you crank it up to the max and let it cook for a while."},$R[205]={speaker:"Jo",text:"That's the workflow. You're trading developer time for machine time. The ultimate goal is to get that performance boost for the end-user, but you balance that with how long you, the developer, are willing to wait for your code to build."},$R[206]={speaker:"Beau",text:"It’s a bit of a dark art then, isn’t it? Knowing which optimizations to apply and when. You're not just writing code; you're telling the compiler *how* to rewrite your code for you."},$R[207]={speaker:"Jo",text:"It really is. It’s this hidden layer of performance engineering that happens almost automatically, turning our very human, sometimes inefficient, code into something ruthlessly efficient for the machine."}]},$R[208]={type:"podcast",title:"Code Generation",nodeId:"1c6sygx",audioUrl:"https://oboe-storage.s3.amazonaws.com/dev/podcasts/v1/node-484638/2ef25185-23ea-4070-8629-d1829e744632.m3u8",episodeVariant:"full",scriptParts:$R[209]=[$R[210]={speaker:"Beau",text:"Okay, so last time we talked about optimization, which felt like the compiler's spring cleaning phase. It tidies everything up, makes it super efficient. But... we still have this 'intermediate code', right? It's not something my computer can actually, you know, run."},$R[211]={speaker:"Jo",text:"Exactly. It's like having a perfectly edited, final draft of a recipe, but it's written in a generic, universal recipe language that no specific chef actually uses. It's clean, it's correct, but it's not actionable yet."},$R[212]={speaker:"Beau",text:"So we need to translate it for the chef. Or in this case, the CPU."},$R[213]={speaker:"Jo",text:"That is precisely what code generation is. It's the final, crucial step where the compiler takes that optimized intermediate code and translates it into the specific language of the target machine. This is where the rubber meets the road."},$R[214]={speaker:"Beau",text:"The 'target machine'... you mean like my laptop's processor versus, say, my phone's processor?"},$R[215]={speaker:"Jo",text:"Yep. Your laptop is probably running on an x86 architecture, while your phone is likely ARM. They speak fundamentally different languages—different dialects, you could say. They have different sets of instructions they understand."},$R[216]={speaker:"Beau",text:"So the code generator has to be a polyglot. It needs to know all these different dialects."},$R[217]={speaker:"Jo",text:"It does. And that's one of its biggest jobs: instruction selection. Let's say our intermediate code has a simple line: 'add A and B'. The code generator looks at the target machine's instruction set. One CPU might have a single command, like `ADD A, B`. Simple."},$R[218]={speaker:"Beau",text:"Okay, that makes sense."},$R[219]={speaker:"Jo",text:"But another, perhaps older or simpler, CPU might not have that. It might need three separate instructions: one to load A into a special workspace, one to load B into another, and a third to actually perform the addition. The code generator has to choose the most efficient sequence of instructions available on that specific hardware."},$R[220]={speaker:"Beau",text:"A special workspace? What do you mean?"},$R[221]={speaker:"Jo",text:"That brings us to the next massive piece of the puzzle: register allocation. Think of the CPU as a master craftsman at a tiny workbench. The main computer memory, the RAM, is a giant warehouse full of tools and materials down the street. It's huge, but it's slow to get things from there."},$R[222]={speaker:"Beau",text:"Okay, I'm with you."},$R[223]={speaker:"Jo",text:"The registers are the craftsman's workbench. There's only a handful of spots on it—maybe 8, 16, 32—but anything on that workbench is instantly accessible. It's incredibly fast. Register allocation is the art of deciding which variables, which pieces of data, get to live on that precious workbench space and for how long."},$R[224]={speaker:"Beau",text:"So if you have a variable you're using over and over in a loop, you'd want to keep it on the workbench, in a register."},$R[225]={speaker:"Jo",text:"Exactly! If you keep having to send a runner to the warehouse for it, your whole process grinds to a halt. But the challenge is, you have limited space. What if you need 50 variables for a complex calculation but only have 16 registers? The code generator has to play this complex game of Tetris, constantly moving data between the slow warehouse and the fast workbench. This is one of the hardest problems in computer science, by the way."},$R[226]={speaker:"Beau",text:"Wow. So it's not just a straight translation. It's a strategic resource management game."},$R[227]={speaker:"Jo",text:"A very strategic one. And getting it right is the difference between code that flies and code that crawls. Once it's figured out the instructions and where the data will live, it can finally... generate the code."},$R[228]={speaker:"Beau",text:"Which is... what, exactly? What does the final output look like? Is it the ones and zeros?"},$R[229]={speaker:"Jo",text:"Almost. It typically generates assembly code first. Assembly is a human-readable representation of machine code. Instead of a string of ones and zeros, you'll have short commands like `MOV`, `ADD`, `JMP` for 'move', 'add', 'jump'. It's the lowest-level language you can get before you're just talking in binary."},$R[230]={speaker:"Beau",text:"And then something else turns that into the ones and zeros?"},$R[231]={speaker:"Jo",text:"Right, a program called an assembler does that final, more straightforward translation. But the compiler's job is effectively done once it produces that assembly code. It has created the final, executable blueprint for the target machine."},$R[232]={speaker:"Beau",text:"So the big challenges are knowing all the different machine languages, picking the best instructions for the job, and then that crazy hard register allocation puzzle."},$R[233]={speaker:"Jo",text:"That's it. And it's why compilers are such amazing pieces of software. We write one piece of high-level code, and the compiler does all this incredibly complex, architecture-specific work to make it run efficiently on a dozen different types of hardware. It's the ultimate translator."},$R[234]={speaker:"Beau",text:"It feels less like a translator and more like a logistics manager for a world tour. It doesn't just translate the songs, it figures out the right stage, the right instruments, and where every musician needs to stand for the best performance in every single city."},$R[235]={speaker:"Jo",text:"I love that analogy. That's a perfect way to think about it. The code generator is the tour manager for your code."}]},$R[236]={type:"podcast",title:"Error Handling and Symbol Tables",nodeId:"t0qwim",audioUrl:"https://oboe-storage.s3.amazonaws.com/dev/podcasts/v1/node-484640/1a3e798d-c46f-4eec-8dd6-cb05be739219.m3u8",episodeVariant:"full",scriptParts:$R[237]=[$R[238]={speaker:"Beau",text:"Okay, Jo. So, we've walked through this whole elegant process... lexical analysis, syntax, semantics... It all sounds so clean, so perfect. But my code is... almost never perfect on the first try. What happens when the compiler hits one of my, uh, 'creative' mistakes?"},$R[239]={speaker:"Jo",text:"That is the critical question, isn't it? A compiler that only works on perfect code is useless. A huge part of its job is acting as a diagnostician. It has to handle errors gracefully, and to do that, it needs a way to remember everything it's learned about your code. That brings us to two really core ideas: error handling and symbol tables."},$R[240]={speaker:"Beau",text:"Error handling... I'm painfully familiar with that part. The giant wall of red text in my terminal. But are all those errors the same? It feels like sometimes it's a simple typo and other times it's... something deeper."},$R[241]={speaker:"Jo",text:"They're not. They actually map pretty closely to the phases we've already talked about. The first kind you'll hit is a lexical error."},$R[242]={speaker:"Beau",text:"Lexical... like from the lexical analyzer? The thing that makes tokens?"},$R[243]={speaker:"Jo",text:"Exactly. A lexical error is when the analyzer finds a sequence of characters it can't turn into a valid token. Think of it like a word that isn't in the language's dictionary. If you type something like `int my#Var;`... that hash symbol isn't a valid character for a variable name, or an operator in that context. The lexical analyzer just stops and says, 'I don't know what this symbol is.'"},$R[244]={speaker:"Beau",text:"Okay, so that's the most basic typo. Like a spelling mistake. What's next?"},$R[245]={speaker:"Jo",text:"Next up is a syntax error. This is the one most people are familiar with. Here, the tokens themselves are all valid—the words are spelled correctly—but the grammar is wrong. The sentence structure doesn't follow the language's rules."},$R[246]={speaker:"Beau",text:"Ah, the classic missing semicolon. Or my personal favorite, a mismatched parenthesis somewhere in a deeply nested function call."},$R[247]={speaker:"Jo",text:"Precisely. The parser, which we talked about in the syntax analysis phase, is trying to build that parse tree. If you write `if (x > 5 { ...`, it sees the token 'if', the '(', the 'x', but it never finds the closing parenthesis it was expecting. It can't complete the rule for an 'if' statement, so it flags a syntax error."},$R[248]={speaker:"Beau",text:"Okay, so... lexical is a bad symbol, syntax is bad grammar. What's the third type?"},$R[249]={speaker:"Jo",text:"The third, and often trickiest, is a semantic error. This is where the code is grammatically perfect. The spelling is right, the sentence structure is valid, but it just doesn't make any sense."},$R[250]={speaker:"Beau",text:"Like the sentence 'Colorless green ideas sleep furiously.' It's grammatically correct, but... meaningless."},$R[251]={speaker:"Jo",text:"That's a perfect analogy. In code, this could be trying to add a number to a string, like `int result = 5 + \"hello\";`. The syntax is fine: variable equals value plus value. But the *meaning*, the semantics, is wrong. You can't mathematically add a word to a number. This is where type checking, from the semantic analysis phase, catches the error."},$R[252]={speaker:"Beau",text:"Or trying to call a function that doesn't exist, or passing it the wrong number of arguments?"},$R[253]={speaker:"Jo",text:"Exactly. All semantic errors. So the compiler has found an error. What should it do? Just stop?"},$R[254]={speaker:"Beau",text:"Well, the bad ones do. They find one error, scream at you, and give up. The good ones try to find as many errors as possible in one go, which is way more helpful."},$R[255]={speaker:"Jo",text:"And that's called error recovery. It's a huge challenge in compiler design. When a parser hits a syntax error, for instance, it's out of sync with the code's grammar. A good compiler will try to recover. Maybe it skips tokens until it finds a semicolon, assuming a statement just ended incorrectly. Or maybe it inserts a missing parenthesis in its internal model and tries to keep going. The goal is to report the first error accurately, and then resynchronize to find subsequent, unrelated errors."},$R[256]={speaker:"Beau",text:"So it's making an educated guess to try and salvage the rest of the compilation. That makes sense. But... to know that I'm using a variable incorrectly, or that a function doesn't exist... the compiler has to... remember things, right? It can't just look at one line at a time."},$R[257]={speaker:"Jo",text:"You've hit on the exact purpose of the symbol table. The symbol table is the compiler's memory. It's a data structure that keeps track of every identifier—every variable name, function name, class name—that you declare in your code."},$R[258]={speaker:"Beau",text:"So when I write `int myVar = 10;`, the compiler doesn't just process it and forget it. It writes it down."},$R[259]={speaker:"Jo",text:"Exactly. The lexical analyzer identifies 'myVar' as an identifier token. Then, during semantic analysis, the compiler adds an entry to the symbol table. This entry isn't just the name 'myVar'. It stores its type—integer. It stores its scope—where in the code is it visible? Inside this function? Globally? It might even store its memory location later on."},$R[260]={speaker:"Beau",text:"Ah, and that's how it catches those semantic errors! Later, if I try to do `myVar = \"hello\";`, it looks up 'myVar' in the symbol table, sees its type is 'integer', sees I'm trying to assign a 'string', and throws a type mismatch error."},$R[261]={speaker:"Jo",text:"Precisely. And it's crucial for scope. If you declare a variable 'i' inside a for loop, the compiler adds it to the symbol table but marks its scope as being just that loop. When the parser leaves the loop, it effectively removes that entry, or marks it as out-of-scope. So if you try to use 'i' after the loop, the compiler looks it up, can't find it in the current scope, and reports an 'undeclared identifier' error."},$R[262]={speaker:"Beau",text:"So the symbol table is like a constantly-updating phonebook for my code's variables. It's not just a flat list, it has sections for different... neighborhoods, or scopes."},$R[263]={speaker:"Jo",text:"That's a great way to put it. It's often implemented as a stack of tables. When you enter a new function or a new block of code, you push a new table onto the stack for that local scope. When you leave, you pop it off. This makes looking up a variable really efficient—you check the local table first, then the one outside it, and so on, all the way to the global scope."},$R[264]={speaker:"Beau",text:"So really, good error reporting is completely dependent on having a good, well-managed symbol table."},$R[265]={speaker:"Jo",text:"They are two sides of the same coin. You can't have one without the other. The symbol table provides the context, the memory, that allows the compiler to make intelligent decisions about whether your code is just grammatically incorrect or truly nonsensical."},$R[266]={speaker:"Beau",text:"It feels less like a strict referee now and more like a... very pedantic, but helpful, partner who's constantly checking my work against a shared set of notes."},$R[267]={speaker:"Jo",text:"And that's its job. To not just translate, but to validate and assist. Without robust error handling and a symbol table to keep track of everything, compilers would be practically unusable for us humans."}]},$R[268]={type:"podcast",title:"Compiler Construction Tools and Case Studies",nodeId:"19o9ged",audioUrl:"https://oboe-storage.s3.amazonaws.com/dev/podcasts/v1/node-484644/16fa3a46-8658-4d1b-8e9d-a8da16188272.m3u8",episodeVariant:"full",scriptParts:$R[269]=[$R[270]={speaker:"Beau",text:"Okay, Jo. So we've walked through all seven phases of a compiler, from lexical analysis all the way to spitting out machine code. And I've got to be honest, my main takeaway is... I would never, ever want to write one of these from scratch. It seems monumentally complicated."},$R[271]={speaker:"Jo",text:"You and pretty much every other programmer in history. It *is* a huge undertaking. Which is exactly why, almost as long as there have been compilers, there have been tools to help build them. People realized pretty quickly that certain parts of the process were... well, repetitive."},$R[272]={speaker:"Beau",text:"Repetitive how? Each programming language is totally different, right?"},$R[273]={speaker:"Jo",text:"The languages are different, but the *tasks* are the same. Take that first phase, lexical analysis. The goal is always to scan through the text and chop it up into tokens. You need to identify keywords, numbers, operators... The specifics change, but the job of 'find patterns in text' doesn't. So, tools were created to automate generating that part of the compiler."},$R[274]={speaker:"Beau",text:"Okay, so a tool that makes a part of a compiler. A compiler-compiler, almost?"},$R[275]={speaker:"Jo",text:"Exactly! And the classic examples are two tools called Lex and Yacc. Let's start with Lex. It's a lexical analyzer generator. You basically feed it a file of rules, using regular expressions, that describe what the tokens in your language look like. You know, 'a number is one or more digits,' 'a variable name starts with a letter,' that sort of thing."},$R[276]={speaker:"Beau",text:"So instead of writing the C code or whatever to manually scan character by character to find the end of a number, you just give Lex the definition of a number, and it writes that C code *for* you?"},$R[277]={speaker:"Jo",text:"Precisely. It automates one of the most tedious parts. Now, once Lex has chopped up the source code into a stream of tokens—like 'IF', 'LEFT_PAREN', 'VARIABLE', 'EQUALS', 'NUMBER', 'RIGHT_PAREN'—you need to make sure they're in a grammatically correct order. And that's where Yacc comes in."},$R[278]={speaker:"Beau",text:"Yacc. Sounds... like an animal."},$R[279]={speaker:"Jo",text:"It stands for Yet Another Compiler-Compiler. It's a parser generator. You give Yacc a set of grammar rules, like 'an if-statement is composed of an IF token, followed by a condition in parentheses, followed by a block of code'. Yacc then generates the parser code that can take the stream of tokens from Lex and figure out if they form valid statements according to your grammar."},$R[280]={speaker:"Beau",text:"Ah, okay. So they're a team. Lex is like the spotter who identifies the individual pieces—the nouns, verbs, adjectives. Then Yacc is the grammar expert who checks if the pieces form a coherent sentence."},$R[281]={speaker:"Jo",text:"That's a perfect analogy. And these tools, or modern versions of them, are still used. But when we talk about the big, industrial-strength compilers that we use every day, we're usually talking about massive projects like GCC or LLVM."},$R[282]={speaker:"Beau",text:"I've definitely seen those names pop up when installing developer tools. GCC is the GNU one, right?"},$R[283]={speaker:"Jo",text:"Yep, the GNU Compiler Collection. It's one of the oldest and most successful open-source projects ever. It's... monolithic. Think of it like a giant, expertly-crafted machine. It has a single, massive codebase that was designed from the ground up to compile C, and then later added support for C++, Fortran, and others."},$R[284]={speaker:"Beau",text:"So it has a front-end for C, a front-end for Fortran, and they all feed into this one giant, shared middle and back-end that does the optimization and code generation?"},$R[285]={speaker:"Jo",text:"That's the idea. It's incredibly powerful and produces highly optimized code. For a long time, it was *the* standard. But that monolithic design can make it a bit hard to work with if you want to... well, play with the pieces."},$R[286]={speaker:"Beau",text:"And I'm guessing that's where LLVM comes in?"},$R[287]={speaker:"Jo",text:"You got it. LLVM started as a research project and took a totally different approach. It stands for Low Level Virtual Machine, but that name is a bit of a historical artifact now. The key idea behind LLVM is modularity. It's not one giant program; it's a collection of libraries and tools that are designed to work together."},$R[288]={speaker:"Beau",text:"So it's like a box of compiler LEGOs instead of a pre-built starship model?"},$R[289]={speaker:"Jo",text:"Exactly. You have a library for parsing C-family languages, called Clang. You have libraries for optimization. You have libraries for generating code for different chips—x86, ARM, whatever. And because they're libraries, you can use them in your own projects."},$R[290]={speaker:"Beau",text:"What kind of projects? Why would I want just one piece of a compiler?"},$R[291]={speaker:"Jo",text:"Think about your code editor. When it highlights a syntax error as you type, how does it know it's an error? It's using a parser, just like a compiler would. With LLVM's modular design, the developers of that editor can just pull in the Clang library to parse your code in real-time without needing the *entire* compiler infrastructure."},$R[292]={speaker:"Beau",text:"Whoa. Okay, so static analysis tools, code completion, refactoring tools... they can all just borrow the 'front-end' part of the compiler because LLVM makes it available as a separate LEGO block."},$R[293]={speaker:"Jo",text:"Precisely. This modularity has led to a huge explosion in tooling. Apple's Swift language is built on LLVM. Rust's compiler uses LLVM for its backend. It's become the foundation for a whole ecosystem of programming languages and developer tools because it's so flexible."},$R[294]={speaker:"Beau",text:"So, GCC is the established, powerful, all-in-one battleship, and LLVM is the modern, flexible aircraft carrier that can launch all sorts of different, specialized planes."},$R[295]={speaker:"Jo",text:"I love that analogy. Both are incredibly important and powerful, but they represent two different philosophies of design. And understanding those philosophies shows you that a compiler isn't just one thing—it can be a tool for understanding and transforming code in all sorts of ways."},$R[296]={speaker:"Beau",text:"So even if you never write a compiler from scratch—which, again, I will not be doing—these concepts are literally running inside the tools I use every single day."},$R[297]={speaker:"Jo",text:"They are. From the linter that checks your code style to the debugger that steps through your program. The principles of compilation are everywhere."}]}],songs:$R[298]=[],exams:$R[299]=[],guides:$R[300]=[],worksheets:$R[301]=[],flashcards:$R[302]=[],diagrams:$R[303]=[],documents:$R[304]=[],chapters:$R[305]=[$R[306]={uuid:"0",title:"Introduction to Compiler Design",includesKnowledgeBase:!1,hasDemonstratedMastery:!1,streaming:!1,blocks:$R[307]=[$R[308]={content:$R[309]={type:"header",text:"What is a Compiler?"},uuid:"0|0"},$R[310]={content:$R[311]={type:"text",text:"Computers don't understand programming languages like C, Python, or Java. They only understand machine code, which is a series of ones and zeros. So, how does the code you write get turned into something a computer can actually run? That's the job of a compiler."},uuid:"0|1"},$R[312]={content:$R[313]={type:"blockquote",text:"A compiler is a special program that translates code written in a high-level programming language into a lower-level language, like machine code, that the CPU can execute."},uuid:"0|2"},$R[314]={content:$R[315]={type:"text",text:"Think of it like a human translator. Imagine you write a book in English, but your reader only understands Japanese. You'd need a translator to read your entire English book and produce a complete, standalone Japanese version. The compiler does the same thing for your code, creating an executable file (`.exe` on Windows, for example) that can be run directly by the computer."},uuid:"0|3"},$R[316]={content:$R[317]={type:"realImage",url:"https://oboe-storage.s3.amazonaws.com/dev/imagesReal/v1/course-25235/eb209bf5-8724-4e86-882c-3d37628ed9c6.jpeg",attributionUrl:"https://commons.wikimedia.org/wiki/File:Software_IDE_Process.jpg",caption:"A compiler is a key part of the process that turns source code into a runnable program."},uuid:"0|4"},$R[318]={content:$R[319]={type:"header",text:"Compilers vs. Interpreters"},uuid:"0|5"},$R[320]={content:$R[321]={type:"text",text:"Compilers aren't the only type of translator out there. There's another kind called an interpreter. While they both achieve the same goal of running your code, they work in fundamentally different ways."},uuid:"0|6"},$R[322]={content:$R[323]={type:"text",text:"An interpreter translates your code one line at a time and executes that line immediately. It's like having a simultaneous interpreter at a conference. As someone speaks, the interpreter listens to a sentence, translates it, and says it out loud. They don't wait for the entire speech to be finished."},uuid:"0|7"},$R[324]={content:$R[325]={type:"text",text:"A compiler, on the other hand, translates the *entire* program at once before the program is run for the first time. It scans all your code, checks for errors, and produces a complete, translated executable file. The key difference is when the translation happens."},uuid:"0|8"},$R[326]={content:$R[327]={type:"table",markdown:"| Feature | Compiler | Interpreter |\n| :--- | :--- | :--- |\n| **Translation** | Translates the entire program at once, before execution. | Translates the program line by line, during execution. |\n| **Output** | Creates a standalone executable file. | Does not create a separate file; it just runs the code. |\n| **Execution Speed** | Generally faster, as the translation is already done. | Generally slower, as translation happens on the fly. |\n| **Error Handling** | Reports all errors at once after scanning the whole program. | Reports the first error it finds and stops execution. |"},uuid:"0|9"},$R[328]={content:$R[329]={type:"header",text:"The Journey of Compilation"},uuid:"0|10"},$R[330]={content:$R[331]={type:"text",text:"Compilation isn't a single, magical step. It's more like an assembly line, with the source code passing through several distinct phases. Each phase takes the output from the previous one, processes it, and passes it along to the next. This entire process is often called the \"compiler pipeline.\""},uuid:"0|11"},$R[332]={content:$R[333]={svgMarkup:"\x3C?xml version='1.0' encoding='UTF-8'?>\n\x3C!-- This file was generated by dvisvgm 2.11.1 -->\n\x3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='340.15748pt' height='308.589551pt' viewBox='226.488189 336.10932 340.15748 308.589551'>\n\x3Cdefs>\n\x3Cpath id='g1-65' d='M3.965131-6.933998C3.915318-7.063512 3.895392-7.13325 3.73599-7.13325S3.5467-7.073474 3.496887-6.933998L1.43462-.976339C1.255293-.468244 .856787-.318804 .318804-.308842V0C.547945-.009963 .976339-.029888 1.334994-.029888C1.643836-.029888 2.161893-.009963 2.480697 0V-.308842C1.982565-.308842 1.733499-.557908 1.733499-.816936C1.733499-.846824 1.743462-.946451 1.753425-.966376L2.211706-2.271482H4.672478L5.200498-.747198C5.210461-.707347 5.230386-.647572 5.230386-.607721C5.230386-.308842 4.672478-.308842 4.403487-.308842V0C4.762142-.029888 5.459527-.029888 5.838107-.029888C6.266501-.029888 6.724782-.019925 7.143213 0V-.308842H6.963885C6.366127-.308842 6.22665-.37858 6.117061-.707347L3.965131-6.933998ZM3.437111-5.818182L4.562889-2.580324H2.321295L3.437111-5.818182Z'/>\n\x3Cpath id='g1-67' d='M.557908-3.407223C.557908-1.344956 2.171856 .219178 4.024907 .219178C5.648817 .219178 6.625156-1.165629 6.625156-2.321295C6.625156-2.420922 6.625156-2.49066 6.495641-2.49066C6.386052-2.49066 6.386052-2.430884 6.37609-2.331258C6.296389-.9066 5.230386-.089664 4.144458-.089664C3.536737-.089664 1.58406-.428394 1.58406-3.39726C1.58406-6.37609 3.526775-6.714819 4.134496-6.714819C5.220423-6.714819 6.107098-5.808219 6.306351-4.353674C6.326276-4.214197 6.326276-4.184309 6.465753-4.184309C6.625156-4.184309 6.625156-4.214197 6.625156-4.423412V-6.784558C6.625156-6.953923 6.625156-7.023661 6.515567-7.023661C6.475716-7.023661 6.435866-7.023661 6.356164-6.90411L5.858032-6.166874C5.489415-6.525529 4.98132-7.023661 4.024907-7.023661C2.161893-7.023661 .557908-5.439601 .557908-3.407223Z'/>\n\x3Cpath id='g1-69' d='M1.354919-.777086C1.354919-.418431 1.334994-.308842 .56787-.308842H.328767V0H6.07721L6.495641-2.570361H6.246575C5.997509-1.036115 5.768369-.308842 4.054795-.308842H2.729763C2.261519-.308842 2.241594-.37858 2.241594-.707347V-3.367372H3.138232C4.104608-3.367372 4.214197-3.048568 4.214197-2.201743H4.463263V-4.841843H4.214197C4.214197-3.985056 4.104608-3.676214 3.138232-3.676214H2.241594V-6.067248C2.241594-6.396015 2.261519-6.465753 2.729763-6.465753H4.014944C5.539228-6.465753 5.808219-5.917808 5.967621-4.533001H6.216687L5.937733-6.774595H.328767V-6.465753H.56787C1.334994-6.465753 1.354919-6.356164 1.354919-5.997509V-.777086Z'/>\n\x3Cpath id='g1-71' d='M5.907846-.627646C6.03736-.408468 6.435866-.009963 6.545455-.009963C6.635118-.009963 6.635118-.089664 6.635118-.239103V-1.972603C6.635118-2.361146 6.674969-2.410959 7.32254-2.410959V-2.719801C6.953923-2.709838 6.405978-2.689913 6.107098-2.689913C5.708593-2.689913 4.861768-2.689913 4.503113-2.719801V-2.410959H4.821918C5.718555-2.410959 5.748443-2.30137 5.748443-1.932752V-1.295143C5.748443-.179328 4.483188-.089664 4.204234-.089664C3.556663-.089664 1.58406-.438356 1.58406-3.407223C1.58406-6.386052 3.5467-6.714819 4.144458-6.714819C5.210461-6.714819 6.117061-5.818182 6.316314-4.353674C6.336239-4.214197 6.336239-4.184309 6.475716-4.184309C6.635118-4.184309 6.635118-4.214197 6.635118-4.423412V-6.784558C6.635118-6.953923 6.635118-7.023661 6.525529-7.023661C6.485679-7.023661 6.445828-7.023661 6.366127-6.90411L5.867995-6.166874C5.549191-6.485679 5.011208-7.023661 4.024907-7.023661C2.171856-7.023661 .557908-5.449564 .557908-3.407223S2.15193 .219178 4.044832 .219178C4.772105 .219178 5.569116-.039851 5.907846-.627646Z'/>\n\x3Cpath id='g1-72' d='M6.107098-6.027397C6.107098-6.386052 6.127024-6.495641 6.894147-6.495641H7.13325V-6.804483C6.784558-6.774595 6.047323-6.774595 5.668742-6.774595S4.542964-6.774595 4.194271-6.804483V-6.495641H4.433375C5.200498-6.495641 5.220423-6.386052 5.220423-6.027397V-3.696139H2.241594V-6.027397C2.241594-6.386052 2.261519-6.495641 3.028643-6.495641H3.267746V-6.804483C2.919054-6.774595 2.181818-6.774595 1.803238-6.774595S.67746-6.774595 .328767-6.804483V-6.495641H.56787C1.334994-6.495641 1.354919-6.386052 1.354919-6.027397V-.777086C1.354919-.418431 1.334994-.308842 .56787-.308842H.328767V0C.67746-.029888 1.414695-.029888 1.793275-.029888S2.919054-.029888 3.267746 0V-.308842H3.028643C2.261519-.308842 2.241594-.418431 2.241594-.777086V-3.387298H5.220423V-.777086C5.220423-.418431 5.200498-.308842 4.433375-.308842H4.194271V0C4.542964-.029888 5.280199-.029888 5.65878-.029888S6.784558-.029888 7.13325 0V-.308842H6.894147C6.127024-.308842 6.107098-.418431 6.107098-.777086V-6.027397Z'/>\n\x3Cpath id='g1-73' d='M2.241594-6.027397C2.241594-6.386052 2.271482-6.495641 3.058531-6.495641H3.317559V-6.804483C2.968867-6.774595 2.181818-6.774595 1.803238-6.774595C1.414695-6.774595 .627646-6.774595 .278954-6.804483V-6.495641H.537983C1.325031-6.495641 1.354919-6.386052 1.354919-6.027397V-.777086C1.354919-.418431 1.325031-.308842 .537983-.308842H.278954V0C.627646-.029888 1.414695-.029888 1.793275-.029888C2.181818-.029888 2.968867-.029888 3.317559 0V-.308842H3.058531C2.271482-.308842 2.241594-.418431 2.241594-.777086V-6.027397Z'/>\n\x3Cpath id='g1-76' d='M5.798257-2.570361H5.549191C5.439601-1.554172 5.300125-.308842 3.5467-.308842H2.729763C2.261519-.308842 2.241594-.37858 2.241594-.707347V-6.017435C2.241594-6.356164 2.241594-6.495641 3.188045-6.495641H3.516812V-6.804483C3.158157-6.774595 2.251557-6.774595 1.843088-6.774595C1.454545-6.774595 .67746-6.774595 .328767-6.804483V-6.495641H.56787C1.334994-6.495641 1.354919-6.386052 1.354919-6.027397V-.777086C1.354919-.418431 1.334994-.308842 .56787-.308842H.328767V0H5.519303L5.798257-2.570361Z'/>\n\x3Cpath id='g1-77' d='M2.400996-6.585305C2.311333-6.804483 2.281445-6.804483 2.052304-6.804483H.368618V-6.495641H.607721C1.374844-6.495641 1.39477-6.386052 1.39477-6.027397V-1.046077C1.39477-.777086 1.39477-.308842 .368618-.308842V0C.71731-.009963 1.205479-.029888 1.534247-.029888S2.351183-.009963 2.699875 0V-.308842C1.673724-.308842 1.673724-.777086 1.673724-1.046077V-6.41594H1.683686L4.084682-.219178C4.134496-.089664 4.184309 0 4.283935 0C4.393524 0 4.423412-.079701 4.463263-.18929L6.914072-6.495641H6.924035V-.777086C6.924035-.418431 6.90411-.308842 6.136986-.308842H5.897883V0C6.266501-.029888 6.94396-.029888 7.332503-.029888S8.388543-.029888 8.757161 0V-.308842H8.518057C7.750934-.308842 7.731009-.418431 7.731009-.777086V-6.027397C7.731009-6.386052 7.750934-6.495641 8.518057-6.495641H8.757161V-6.804483H7.073474C6.814446-6.804483 6.814446-6.794521 6.744707-6.615193L4.562889-1.006227L2.400996-6.585305Z'/>\n\x3Cpath id='g1-79' d='M7.183064-3.377335C7.183064-5.409714 5.678705-7.023661 3.865504-7.023661C2.082192-7.023661 .557908-5.429639 .557908-3.377335C.557908-1.334994 2.092154 .219178 3.865504 .219178C5.678705 .219178 7.183064-1.364882 7.183064-3.377335ZM3.875467-.039851C2.919054-.039851 1.58406-.916563 1.58406-3.516812C1.58406-6.097136 3.038605-6.774595 3.865504-6.774595C4.732254-6.774595 6.156912-6.067248 6.156912-3.516812C6.156912-.876712 4.79203-.039851 3.875467-.039851Z'/>\n\x3Cpath id='g1-83' d='M3.476961-3.865504L2.201743-4.174346C1.58406-4.323786 1.195517-4.861768 1.195517-5.439601C1.195517-6.136986 1.733499-6.744707 2.510585-6.744707C4.174346-6.744707 4.393524-5.110834 4.4533-4.662516C4.463263-4.60274 4.463263-4.542964 4.572852-4.542964C4.702366-4.542964 4.702366-4.592777 4.702366-4.782067V-6.784558C4.702366-6.953923 4.702366-7.023661 4.592777-7.023661C4.523039-7.023661 4.513076-7.013699 4.443337-6.894147L4.094645-6.326276C3.795766-6.615193 3.387298-7.023661 2.500623-7.023661C1.39477-7.023661 .557908-6.146949 .557908-5.090909C.557908-4.26401 1.085928-3.536737 1.863014-3.267746C1.972603-3.227895 2.480697-3.108344 3.178082-2.938979C3.447073-2.86924 3.745953-2.799502 4.024907-2.430884C4.234122-2.171856 4.333748-1.843088 4.333748-1.514321C4.333748-.806974 3.835616-.089664 2.998755-.089664C2.709838-.089664 1.952677-.139477 1.424658-.627646C.846824-1.165629 .816936-1.803238 .806974-2.161893C.797011-2.261519 .71731-2.261519 .687422-2.261519C.557908-2.261519 .557908-2.191781 .557908-2.012453V-.019925C.557908 .14944 .557908 .219178 .667497 .219178C.737235 .219178 .747198 .199253 .816936 .089664C.816936 .079701 .846824 .049813 1.175592-.478207C1.484433-.139477 2.122042 .219178 3.008717 .219178C4.174346 .219178 4.971357-.757161 4.971357-1.853051C4.971357-2.849315 4.313823-3.666252 3.476961-3.865504Z'/>\n\x3Cpath id='g1-84' d='M6.635118-6.744707H.547945L.358655-4.503113H.607721C.747198-6.107098 .896638-6.435866 2.400996-6.435866C2.580324-6.435866 2.839352-6.435866 2.938979-6.41594C3.148194-6.37609 3.148194-6.266501 3.148194-6.03736V-.787049C3.148194-.448319 3.148194-.308842 2.102117-.308842H1.703611V0C2.11208-.029888 3.128269-.029888 3.58655-.029888S5.070984-.029888 5.479452 0V-.308842H5.080946C4.034869-.308842 4.034869-.448319 4.034869-.787049V-6.03736C4.034869-6.236613 4.034869-6.37609 4.214197-6.41594C4.323786-6.435866 4.592777-6.435866 4.782067-6.435866C6.286426-6.435866 6.435866-6.107098 6.575342-4.503113H6.824408L6.635118-6.744707Z'/>\n\x3Cpath id='g1-97' d='M3.317559-.757161C3.35741-.358655 3.626401 .059776 4.094645 .059776C4.303861 .059776 4.911582-.079701 4.911582-.886675V-1.444583H4.662516V-.886675C4.662516-.308842 4.41345-.249066 4.303861-.249066C3.975093-.249066 3.935243-.697385 3.935243-.747198V-2.739726C3.935243-3.158157 3.935243-3.5467 3.576588-3.915318C3.188045-4.303861 2.689913-4.463263 2.211706-4.463263C1.39477-4.463263 .707347-3.995019 .707347-3.337484C.707347-3.038605 .9066-2.86924 1.165629-2.86924C1.444583-2.86924 1.62391-3.068493 1.62391-3.327522C1.62391-3.447073 1.574097-3.775841 1.115816-3.785803C1.384807-4.134496 1.872976-4.244085 2.191781-4.244085C2.67995-4.244085 3.247821-3.855542 3.247821-2.968867V-2.600249C2.739726-2.570361 2.042341-2.540473 1.414695-2.241594C.667497-1.902864 .418431-1.384807 .418431-.946451C.418431-.139477 1.384807 .109589 2.012453 .109589C2.669988 .109589 3.128269-.288917 3.317559-.757161ZM3.247821-2.391034V-1.39477C3.247821-.448319 2.530511-.109589 2.082192-.109589C1.594022-.109589 1.185554-.458281 1.185554-.956413C1.185554-1.504359 1.603985-2.331258 3.247821-2.391034Z'/>\n\x3Cpath id='g1-98' d='M1.713574-3.755915V-6.914072L.278954-6.804483V-6.495641C.976339-6.495641 1.05604-6.425903 1.05604-5.937733V0H1.305106C1.315068-.009963 1.39477-.14944 1.663761-.617684C1.8132-.388543 2.231631 .109589 2.968867 .109589C4.154421 .109589 5.190535-.86675 5.190535-2.15193C5.190535-3.417186 4.214197-4.403487 3.078456-4.403487C2.30137-4.403487 1.872976-3.935243 1.713574-3.755915ZM1.743462-1.135741V-3.188045C1.743462-3.377335 1.743462-3.387298 1.853051-3.5467C2.241594-4.104608 2.789539-4.184309 3.028643-4.184309C3.476961-4.184309 3.835616-3.92528 4.07472-3.5467C4.333748-3.138232 4.363636-2.570361 4.363636-2.161893C4.363636-1.793275 4.343711-1.195517 4.054795-.747198C3.845579-.438356 3.466999-.109589 2.929016-.109589C2.480697-.109589 2.122042-.348692 1.882939-.71731C1.743462-.926526 1.743462-.956413 1.743462-1.135741Z'/>\n\x3Cpath id='g1-99' d='M1.165629-2.171856C1.165629-3.795766 1.982565-4.214197 2.510585-4.214197C2.600249-4.214197 3.227895-4.204234 3.576588-3.845579C3.16812-3.815691 3.108344-3.516812 3.108344-3.387298C3.108344-3.128269 3.287671-2.929016 3.566625-2.929016C3.825654-2.929016 4.024907-3.098381 4.024907-3.39726C4.024907-4.07472 3.267746-4.463263 2.500623-4.463263C1.255293-4.463263 .33873-3.387298 .33873-2.15193C.33873-.876712 1.325031 .109589 2.480697 .109589C3.815691 .109589 4.134496-1.085928 4.134496-1.185554S4.034869-1.285181 4.004981-1.285181C3.915318-1.285181 3.895392-1.24533 3.875467-1.185554C3.58655-.259029 2.938979-.139477 2.570361-.139477C2.042341-.139477 1.165629-.56787 1.165629-2.171856Z'/>\n\x3Cpath id='g1-100' d='M3.785803-.547945V.109589L5.250311 0V-.308842C4.552927-.308842 4.473225-.37858 4.473225-.86675V-6.914072L3.038605-6.804483V-6.495641C3.73599-6.495641 3.815691-6.425903 3.815691-5.937733V-3.785803C3.526775-4.144458 3.098381-4.403487 2.560399-4.403487C1.384807-4.403487 .33873-3.427148 .33873-2.141968C.33873-.876712 1.315068 .109589 2.450809 .109589C3.088418 .109589 3.536737-.229141 3.785803-.547945ZM3.785803-3.217933V-1.175592C3.785803-.996264 3.785803-.976339 3.676214-.806974C3.377335-.328767 2.929016-.109589 2.500623-.109589C2.052304-.109589 1.693649-.368618 1.454545-.747198C1.195517-1.155666 1.165629-1.723537 1.165629-2.132005C1.165629-2.500623 1.185554-3.098381 1.474471-3.5467C1.683686-3.855542 2.062267-4.184309 2.600249-4.184309C2.948941-4.184309 3.367372-4.034869 3.676214-3.58655C3.785803-3.417186 3.785803-3.39726 3.785803-3.217933Z'/>\n\x3Cpath id='g1-101' d='M1.115816-2.510585C1.175592-3.995019 2.012453-4.244085 2.351183-4.244085C3.377335-4.244085 3.476961-2.899128 3.476961-2.510585H1.115816ZM1.105853-2.30137H3.88543C4.104608-2.30137 4.134496-2.30137 4.134496-2.510585C4.134496-3.496887 3.596513-4.463263 2.351183-4.463263C1.195517-4.463263 .278954-3.437111 .278954-2.191781C.278954-.856787 1.325031 .109589 2.470735 .109589C3.686177 .109589 4.134496-.996264 4.134496-1.185554C4.134496-1.285181 4.054795-1.305106 4.004981-1.305106C3.915318-1.305106 3.895392-1.24533 3.875467-1.165629C3.526775-.139477 2.630137-.139477 2.530511-.139477C2.032379-.139477 1.633873-.438356 1.404732-.806974C1.105853-1.285181 1.105853-1.942715 1.105853-2.30137Z'/>\n\x3Cpath id='g1-103' d='M2.211706-1.713574C1.344956-1.713574 1.344956-2.709838 1.344956-2.938979C1.344956-3.20797 1.354919-3.526775 1.504359-3.775841C1.58406-3.895392 1.8132-4.174346 2.211706-4.174346C3.078456-4.174346 3.078456-3.178082 3.078456-2.948941C3.078456-2.67995 3.068493-2.361146 2.919054-2.11208C2.839352-1.992528 2.610212-1.713574 2.211706-1.713574ZM1.05604-1.325031C1.05604-1.364882 1.05604-1.594022 1.225405-1.793275C1.613948-1.514321 2.022416-1.484433 2.211706-1.484433C3.138232-1.484433 3.825654-2.171856 3.825654-2.938979C3.825654-3.307597 3.666252-3.676214 3.417186-3.905355C3.775841-4.244085 4.134496-4.293898 4.313823-4.293898C4.333748-4.293898 4.383562-4.293898 4.41345-4.283935C4.303861-4.244085 4.254047-4.134496 4.254047-4.014944C4.254047-3.845579 4.383562-3.726027 4.542964-3.726027C4.64259-3.726027 4.83188-3.795766 4.83188-4.024907C4.83188-4.194271 4.712329-4.513076 4.323786-4.513076C4.124533-4.513076 3.686177-4.4533 3.267746-4.044832C2.849315-4.373599 2.430884-4.403487 2.211706-4.403487C1.285181-4.403487 .597758-3.716065 .597758-2.948941C.597758-2.510585 .816936-2.132005 1.066002-1.92279C.936488-1.77335 .757161-1.444583 .757161-1.09589C.757161-.787049 .886675-.408468 1.195517-.209215C.597758-.039851 .278954 .388543 .278954 .787049C.278954 1.504359 1.265255 2.052304 2.480697 2.052304C3.656289 2.052304 4.692403 1.544209 4.692403 .767123C4.692403 .418431 4.552927-.089664 4.044832-.368618C3.516812-.647572 2.938979-.647572 2.331258-.647572C2.082192-.647572 1.653798-.647572 1.58406-.657534C1.265255-.697385 1.05604-1.006227 1.05604-1.325031ZM2.49066 1.823163C1.484433 1.823163 .797011 1.315068 .797011 .787049C.797011 .328767 1.175592-.039851 1.613948-.069738H2.201743C3.058531-.069738 4.174346-.069738 4.174346 .787049C4.174346 1.325031 3.466999 1.823163 2.49066 1.823163Z'/>\n\x3Cpath id='g1-105' d='M1.763387-4.403487L.368618-4.293898V-3.985056C1.016189-3.985056 1.105853-3.92528 1.105853-3.437111V-.757161C1.105853-.308842 .996264-.308842 .328767-.308842V0C.647572-.009963 1.185554-.029888 1.424658-.029888C1.77335-.029888 2.122042-.009963 2.460772 0V-.308842C1.803238-.308842 1.763387-.358655 1.763387-.747198V-4.403487ZM1.803238-6.136986C1.803238-6.455791 1.554172-6.665006 1.275218-6.665006C.966376-6.665006 .747198-6.396015 .747198-6.136986C.747198-5.867995 .966376-5.608966 1.275218-5.608966C1.554172-5.608966 1.803238-5.818182 1.803238-6.136986Z'/>\n\x3Cpath id='g1-108' d='M1.763387-6.914072L.328767-6.804483V-6.495641C1.026152-6.495641 1.105853-6.425903 1.105853-5.937733V-.757161C1.105853-.308842 .996264-.308842 .328767-.308842V0C.657534-.009963 1.185554-.029888 1.43462-.029888S2.171856-.009963 2.540473 0V-.308842C1.872976-.308842 1.763387-.308842 1.763387-.757161V-6.914072Z'/>\n\x3Cpath id='g1-109' d='M1.09589-3.427148V-.757161C1.09589-.308842 .986301-.308842 .318804-.308842V0C.667497-.009963 1.175592-.029888 1.444583-.029888C1.703611-.029888 2.221669-.009963 2.560399 0V-.308842C1.892902-.308842 1.783313-.308842 1.783313-.757161V-2.590286C1.783313-3.626401 2.49066-4.184309 3.128269-4.184309C3.755915-4.184309 3.865504-3.646326 3.865504-3.078456V-.757161C3.865504-.308842 3.755915-.308842 3.088418-.308842V0C3.437111-.009963 3.945205-.029888 4.214197-.029888C4.473225-.029888 4.991283-.009963 5.330012 0V-.308842C4.662516-.308842 4.552927-.308842 4.552927-.757161V-2.590286C4.552927-3.626401 5.260274-4.184309 5.897883-4.184309C6.525529-4.184309 6.635118-3.646326 6.635118-3.078456V-.757161C6.635118-.308842 6.525529-.308842 5.858032-.308842V0C6.206725-.009963 6.714819-.029888 6.983811-.029888C7.242839-.029888 7.760897-.009963 8.099626 0V-.308842C7.581569-.308842 7.332503-.308842 7.32254-.607721V-2.510585C7.32254-3.367372 7.32254-3.676214 7.013699-4.034869C6.874222-4.204234 6.545455-4.403487 5.967621-4.403487C5.13076-4.403487 4.692403-3.805729 4.523039-3.427148C4.383562-4.293898 3.646326-4.403487 3.198007-4.403487C2.470735-4.403487 2.002491-3.975093 1.723537-3.35741V-4.403487L.318804-4.293898V-3.985056C1.016189-3.985056 1.09589-3.915318 1.09589-3.427148Z'/>\n\x3Cpath id='g1-110' d='M1.09589-3.427148V-.757161C1.09589-.308842 .986301-.308842 .318804-.308842V0C.667497-.009963 1.175592-.029888 1.444583-.029888C1.703611-.029888 2.221669-.009963 2.560399 0V-.308842C1.892902-.308842 1.783313-.308842 1.783313-.757161V-2.590286C1.783313-3.626401 2.49066-4.184309 3.128269-4.184309C3.755915-4.184309 3.865504-3.646326 3.865504-3.078456V-.757161C3.865504-.308842 3.755915-.308842 3.088418-.308842V0C3.437111-.009963 3.945205-.029888 4.214197-.029888C4.473225-.029888 4.991283-.009963 5.330012 0V-.308842C4.811955-.308842 4.562889-.308842 4.552927-.607721V-2.510585C4.552927-3.367372 4.552927-3.676214 4.244085-4.034869C4.104608-4.204234 3.775841-4.403487 3.198007-4.403487C2.470735-4.403487 2.002491-3.975093 1.723537-3.35741V-4.403487L.318804-4.293898V-3.985056C1.016189-3.985056 1.09589-3.915318 1.09589-3.427148Z'/>\n\x3Cpath id='g1-111' d='M4.692403-2.132005C4.692403-3.407223 3.696139-4.463263 2.49066-4.463263C1.24533-4.463263 .278954-3.377335 .278954-2.132005C.278954-.846824 1.315068 .109589 2.480697 .109589C3.686177 .109589 4.692403-.86675 4.692403-2.132005ZM2.49066-.139477C2.062267-.139477 1.62391-.348692 1.354919-.806974C1.105853-1.24533 1.105853-1.853051 1.105853-2.211706C1.105853-2.600249 1.105853-3.138232 1.344956-3.576588C1.613948-4.034869 2.082192-4.244085 2.480697-4.244085C2.919054-4.244085 3.347447-4.024907 3.606476-3.596513S3.865504-2.590286 3.865504-2.211706C3.865504-1.853051 3.865504-1.315068 3.646326-.876712C3.427148-.428394 2.988792-.139477 2.49066-.139477Z'/>\n\x3Cpath id='g1-112' d='M1.713574-3.745953V-4.403487L.278954-4.293898V-3.985056C.986301-3.985056 1.05604-3.92528 1.05604-3.486924V1.175592C1.05604 1.62391 .946451 1.62391 .278954 1.62391V1.932752C.617684 1.92279 1.135741 1.902864 1.39477 1.902864C1.663761 1.902864 2.171856 1.92279 2.520548 1.932752V1.62391C1.853051 1.62391 1.743462 1.62391 1.743462 1.175592V-.498132V-.587796C1.793275-.428394 2.211706 .109589 2.968867 .109589C4.154421 .109589 5.190535-.86675 5.190535-2.15193C5.190535-3.417186 4.224159-4.403487 3.108344-4.403487C2.331258-4.403487 1.912827-3.965131 1.713574-3.745953ZM1.743462-1.135741V-3.35741C2.032379-3.865504 2.520548-4.154421 3.028643-4.154421C3.755915-4.154421 4.363636-3.277709 4.363636-2.15193C4.363636-.946451 3.666252-.109589 2.929016-.109589C2.530511-.109589 2.15193-.308842 1.882939-.71731C1.743462-.926526 1.743462-.936488 1.743462-1.135741Z'/>\n\x3Cpath id='g1-114' d='M1.663761-3.307597V-4.403487L.278954-4.293898V-3.985056C.976339-3.985056 1.05604-3.915318 1.05604-3.427148V-.757161C1.05604-.308842 .946451-.308842 .278954-.308842V0C.667497-.009963 1.135741-.029888 1.414695-.029888C1.8132-.029888 2.281445-.029888 2.67995 0V-.308842H2.470735C1.733499-.308842 1.713574-.418431 1.713574-.777086V-2.311333C1.713574-3.297634 2.132005-4.184309 2.889166-4.184309C2.958904-4.184309 2.978829-4.184309 2.998755-4.174346C2.968867-4.164384 2.769614-4.044832 2.769614-3.785803C2.769614-3.506849 2.978829-3.35741 3.198007-3.35741C3.377335-3.35741 3.626401-3.476961 3.626401-3.795766S3.317559-4.403487 2.889166-4.403487C2.161893-4.403487 1.803238-3.73599 1.663761-3.307597Z'/>\n\x3Cpath id='g1-115' d='M2.072229-1.932752C2.291407-1.892902 3.108344-1.733499 3.108344-1.016189C3.108344-.508095 2.759651-.109589 1.982565-.109589C1.145704-.109589 .787049-.67746 .597758-1.524284C.56787-1.653798 .557908-1.693649 .458281-1.693649C.328767-1.693649 .328767-1.62391 .328767-1.444583V-.129514C.328767 .039851 .328767 .109589 .438356 .109589C.488169 .109589 .498132 .099626 .687422-.089664C.707347-.109589 .707347-.129514 .886675-.318804C1.325031 .099626 1.77335 .109589 1.982565 .109589C3.128269 .109589 3.58655-.557908 3.58655-1.275218C3.58655-1.803238 3.287671-2.102117 3.16812-2.221669C2.839352-2.540473 2.450809-2.620174 2.032379-2.699875C1.474471-2.809465 .806974-2.938979 .806974-3.516812C.806974-3.865504 1.066002-4.273973 1.92279-4.273973C3.01868-4.273973 3.068493-3.377335 3.088418-3.068493C3.098381-2.978829 3.188045-2.978829 3.20797-2.978829C3.337484-2.978829 3.337484-3.028643 3.337484-3.217933V-4.224159C3.337484-4.393524 3.337484-4.463263 3.227895-4.463263C3.178082-4.463263 3.158157-4.463263 3.028643-4.343711C2.998755-4.303861 2.899128-4.214197 2.859278-4.184309C2.480697-4.463263 2.072229-4.463263 1.92279-4.463263C.707347-4.463263 .328767-3.795766 .328767-3.237858C.328767-2.889166 .488169-2.610212 .757161-2.391034C1.075965-2.132005 1.354919-2.072229 2.072229-1.932752Z'/>\n\x3Cpath id='g1-116' d='M1.723537-3.985056H3.148194V-4.293898H1.723537V-6.127024H1.474471C1.464508-5.310087 1.165629-4.244085 .18929-4.204234V-3.985056H1.036115V-1.235367C1.036115-.009963 1.96264 .109589 2.321295 .109589C3.028643 .109589 3.307597-.597758 3.307597-1.235367V-1.803238H3.058531V-1.255293C3.058531-.518057 2.759651-.139477 2.391034-.139477C1.723537-.139477 1.723537-1.046077 1.723537-1.215442V-3.985056Z'/>\n\x3Cpath id='g1-120' d='M2.859278-2.34122C3.158157-2.719801 3.536737-3.20797 3.775841-3.466999C4.084682-3.825654 4.493151-3.975093 4.961395-3.985056V-4.293898C4.702366-4.273973 4.403487-4.26401 4.144458-4.26401C3.845579-4.26401 3.317559-4.283935 3.188045-4.293898V-3.985056C3.39726-3.965131 3.476961-3.835616 3.476961-3.676214S3.377335-3.387298 3.327522-3.327522L2.709838-2.550436L1.932752-3.556663C1.843088-3.656289 1.843088-3.676214 1.843088-3.73599C1.843088-3.88543 1.992528-3.975093 2.191781-3.985056V-4.293898C1.932752-4.283935 1.275218-4.26401 1.115816-4.26401C.9066-4.26401 .438356-4.273973 .169365-4.293898V-3.985056C.86675-3.985056 .876712-3.975093 1.344956-3.377335L2.331258-2.092154L1.39477-.9066C.916563-.328767 .328767-.308842 .119552-.308842V0C.37858-.019925 .687422-.029888 .946451-.029888C1.235367-.029888 1.653798-.009963 1.892902 0V-.308842C1.673724-.33873 1.603985-.468244 1.603985-.617684C1.603985-.836862 1.892902-1.165629 2.500623-1.882939L3.257783-.886675C3.337484-.777086 3.466999-.617684 3.466999-.557908C3.466999-.468244 3.377335-.318804 3.108344-.308842V0C3.407223-.009963 3.965131-.029888 4.184309-.029888C4.4533-.029888 4.841843-.019925 5.140722 0V-.308842C4.60274-.308842 4.423412-.328767 4.194271-.617684L2.859278-2.34122Z'/>\n\x3Cpath id='g1-121' d='M4.134496-3.347447C4.393524-3.975093 4.901619-3.985056 5.061021-3.985056V-4.293898C4.83188-4.273973 4.542964-4.26401 4.313823-4.26401C4.134496-4.26401 3.666252-4.283935 3.447073-4.293898V-3.985056C3.755915-3.975093 3.915318-3.805729 3.915318-3.556663C3.915318-3.457036 3.905355-3.437111 3.855542-3.317559L2.849315-.86675L1.743462-3.5467C1.703611-3.646326 1.683686-3.686177 1.683686-3.726027C1.683686-3.985056 2.052304-3.985056 2.241594-3.985056V-4.293898C1.982565-4.283935 1.325031-4.26401 1.155666-4.26401C.886675-4.26401 .488169-4.273973 .18929-4.293898V-3.985056C.667497-3.985056 .856787-3.985056 .996264-3.636364L2.49066 0C2.440847 .129514 2.30137 .458281 2.241594 .587796C2.022416 1.135741 1.743462 1.823163 1.105853 1.823163C1.05604 1.823163 .826899 1.823163 .637609 1.643836C.946451 1.603985 1.026152 1.384807 1.026152 1.225405C1.026152 .966376 .836862 .806974 .607721 .806974C.408468 .806974 .18929 .936488 .18929 1.235367C.18929 1.683686 .607721 2.042341 1.105853 2.042341C1.733499 2.042341 2.141968 1.474471 2.381071 .9066L4.134496-3.347447Z'/>\n\x3Cpath id='g1-122' d='M3.88543-3.995019C3.975093-4.104608 3.975093-4.124533 3.975093-4.164384C3.975093-4.293898 3.895392-4.293898 3.716065-4.293898H.52802L.418431-2.689913H.667497C.727273-3.706102 .916563-4.07472 2.012453-4.07472H3.148194L.368618-.318804C.278954-.209215 .278954-.18929 .278954-.139477C.278954 0 .348692 0 .537983 0H3.825654L3.995019-1.863014H3.745953C3.656289-.687422 3.447073-.249066 2.291407-.249066H1.115816L3.88543-3.995019Z'/>\n\x3Cpath id='g0-67' d='M7.631382-6.665006C7.631382-6.854296 7.631382-6.94396 7.452055-6.94396C7.362391-6.94396 7.342466-6.924035 7.262765-6.854296L6.60523-6.266501C5.987547-6.764633 5.32005-6.94396 4.64259-6.94396C2.161893-6.94396 .637609-5.459527 .637609-3.417186S2.161893 .109589 4.64259 .109589C6.505604 .109589 7.631382-1.115816 7.631382-2.261519C7.631382-2.460772 7.561644-2.470735 7.392279-2.470735C7.262765-2.470735 7.173101-2.470735 7.163138-2.30137C7.0934-.966376 5.88792-.358655 4.881694-.358655C4.104608-.358655 3.267746-.597758 2.749689-1.205479C2.281445-1.77335 2.161893-2.520548 2.161893-3.417186C2.161893-3.975093 2.191781-5.051059 2.819427-5.708593C3.466999-6.366127 4.333748-6.475716 4.851806-6.475716C5.927771-6.475716 6.874222-5.718555 7.0934-4.4533C7.123288-4.26401 7.13325-4.244085 7.362391-4.244085C7.62142-4.244085 7.631382-4.26401 7.631382-4.523039V-6.665006Z'/>\n\x3Cpath id='g0-77' d='M5.439601-1.315068L3.048568-6.585305C2.938979-6.834371 2.82939-6.834371 2.610212-6.834371H.398506V-6.366127H1.474471V-.757161C1.474471-.537983 1.464508-.52802 1.185554-.498132C.946451-.468244 .926526-.468244 .647572-.468244H.398506V0C.777086-.029888 1.344956-.029888 1.733499-.029888C2.15193-.029888 2.669988-.029888 3.078456 0V-.468244H2.82939C2.650062-.468244 2.480697-.478207 2.30137-.498132C2.012453-.52802 2.002491-.537983 2.002491-.757161V-6.236613H2.012453L4.722291-.249066C4.811955-.049813 4.931507 0 5.041096 0C5.240349 0 5.32005-.14944 5.3599-.239103L8.139477-6.366127H8.14944V-.468244H7.073474V0C7.43213-.029888 8.358655-.029888 8.767123-.029888S10.11208-.029888 10.470735 0V-.468244H9.39477V-6.366127H10.470735V-6.834371H8.268991C8.049813-6.834371 7.940224-6.834371 7.830635-6.585305L5.439601-1.315068Z'/>\n\x3Cpath id='g0-83' d='M4.004981-4.124533L2.560399-4.433375C2.161893-4.523039 1.603985-4.861768 1.603985-5.469489C1.603985-5.897883 1.882939-6.515567 2.879203-6.515567C3.676214-6.515567 4.682441-6.176837 4.911582-4.821918C4.951432-4.582814 4.951432-4.562889 5.160648-4.562889C5.399751-4.562889 5.399751-4.612702 5.399751-4.841843V-6.665006C5.399751-6.854296 5.399751-6.94396 5.220423-6.94396C5.140722-6.94396 5.13076-6.933998 5.021171-6.834371L4.572852-6.396015C3.995019-6.854296 3.347447-6.94396 2.86924-6.94396C1.354919-6.94396 .637609-5.987547 .637609-4.941469C.637609-4.293898 .966376-3.835616 1.175592-3.616438C1.663761-3.128269 2.002491-3.058531 3.088418-2.819427C3.965131-2.630137 4.134496-2.600249 4.353674-2.391034C4.503113-2.241594 4.752179-1.982565 4.752179-1.524284C4.752179-1.046077 4.493151-.358655 3.457036-.358655C2.699875-.358655 1.185554-.557908 1.105853-2.042341C1.09589-2.221669 1.09589-2.271482 .876712-2.271482C.637609-2.271482 .637609-2.211706 .637609-1.982565V-.169365C.637609 .019925 .637609 .109589 .816936 .109589C.9066 .109589 .926526 .089664 1.006227 .019925L1.464508-.438356C2.122042 .049813 3.048568 .109589 3.457036 .109589C5.100872 .109589 5.718555-1.016189 5.718555-2.022416C5.718555-3.128269 4.911582-3.935243 4.004981-4.124533Z'/>\n\x3Cpath id='g0-97' d='M3.726027-.767123C3.726027-.458281 3.726027 0 4.762142 0H5.240349C5.439601 0 5.559153 0 5.559153-.239103C5.559153-.468244 5.429639-.468244 5.300125-.468244C4.692403-.478207 4.692403-.607721 4.692403-.836862V-2.978829C4.692403-3.865504 3.985056-4.513076 2.500623-4.513076C1.932752-4.513076 .71731-4.473225 .71731-3.596513C.71731-3.158157 1.066002-2.968867 1.334994-2.968867C1.643836-2.968867 1.96264-3.178082 1.96264-3.596513C1.96264-3.895392 1.77335-4.064757 1.743462-4.084682C2.022416-4.144458 2.34122-4.154421 2.460772-4.154421C3.20797-4.154421 3.556663-3.73599 3.556663-2.978829V-2.6401C2.849315-2.610212 .318804-2.520548 .318804-1.075965C.318804-.119552 1.554172 .059776 2.241594 .059776C3.038605 .059776 3.506849-.348692 3.726027-.767123ZM3.556663-2.331258V-1.384807C3.556663-.428394 2.6401-.298879 2.391034-.298879C1.882939-.298879 1.484433-.647572 1.484433-1.085928C1.484433-2.161893 3.058531-2.30137 3.556663-2.331258Z'/>\n\x3Cpath id='g0-99' d='M3.58655-4.054795C3.407223-3.895392 3.387298-3.686177 3.387298-3.596513C3.387298-3.158157 3.73599-2.968867 4.004981-2.968867C4.313823-2.968867 4.632628-3.178082 4.632628-3.596513C4.632628-4.4533 3.476961-4.513076 2.899128-4.513076C1.115816-4.513076 .37858-3.367372 .37858-2.211706C.37858-.886675 1.315068 .059776 2.849315 .059776C4.463263 .059776 4.762142-1.09589 4.762142-1.165629C4.762142-1.305106 4.622665-1.305106 4.523039-1.305106C4.343711-1.305106 4.333748-1.285181 4.283935-1.155666C4.024907-.52802 3.5467-.33873 3.038605-.33873C1.653798-.33873 1.653798-1.803238 1.653798-2.261519C1.653798-2.819427 1.653798-4.11457 2.938979-4.11457C3.287671-4.11457 3.457036-4.084682 3.58655-4.054795Z'/>\n\x3Cpath id='g0-100' d='M4.164384-.428394V.059776L5.987547 0V-.468244C5.369863-.468244 5.300125-.468244 5.300125-.856787V-6.914072L3.536737-6.834371V-6.366127C4.154421-6.366127 4.224159-6.366127 4.224159-5.977584V-4.034869C3.726027-4.423412 3.20797-4.483188 2.879203-4.483188C1.424658-4.483188 .37858-3.606476 .37858-2.201743C.37858-.886675 1.295143 .059776 2.769614 .059776C3.377335 .059776 3.855542-.179328 4.164384-.428394ZM4.164384-3.516812V-1.026152C4.034869-.846824 3.626401-.298879 2.86924-.298879C1.653798-.298879 1.653798-1.504359 1.653798-2.201743C1.653798-2.67995 1.653798-3.217933 1.912827-3.606476C2.201743-4.024907 2.669988-4.124533 2.978829-4.124533C3.5467-4.124533 3.945205-3.805729 4.164384-3.516812Z'/>\n\x3Cpath id='g0-101' d='M4.60274-2.171856C4.821918-2.171856 4.921544-2.171856 4.921544-2.440847C4.921544-2.749689 4.861768-3.476961 4.363636-3.975093C3.995019-4.333748 3.466999-4.513076 2.779577-4.513076C1.185554-4.513076 .318804-3.486924 .318804-2.241594C.318804-.9066 1.315068 .059776 2.919054 .059776C4.493151 .059776 4.921544-.996264 4.921544-1.165629C4.921544-1.344956 4.732254-1.344956 4.682441-1.344956C4.513076-1.344956 4.493151-1.295143 4.433375-1.135741C4.224159-.657534 3.656289-.33873 3.008717-.33873C1.603985-.33873 1.594022-1.663761 1.594022-2.171856H4.60274ZM1.594022-2.500623C1.613948-2.889166 1.62391-3.307597 1.833126-3.636364C2.092154-4.034869 2.49066-4.154421 2.779577-4.154421C3.945205-4.154421 3.965131-2.849315 3.975093-2.500623H1.594022Z'/>\n\x3Cpath id='g0-104' d='M1.135741-.468244H.448319V0C.727273-.009963 1.325031-.029888 1.703611-.029888C2.092154-.029888 2.67995-.009963 2.958904 0V-.468244H2.271482V-2.550436C2.271482-3.636364 3.128269-4.124533 3.755915-4.124533C4.094645-4.124533 4.303861-3.915318 4.303861-3.158157V-.468244H3.616438V0C3.895392-.009963 4.493151-.029888 4.871731-.029888C5.260274-.029888 5.84807-.009963 6.127024 0V-.468244H5.439601V-3.048568C5.439601-4.094645 4.901619-4.483188 3.905355-4.483188C2.948941-4.483188 2.440847-3.905355 2.211706-3.506849V-6.914072L.448319-6.834371V-6.366127C1.066002-6.366127 1.135741-6.366127 1.135741-5.977584V-.468244Z'/>\n\x3Cpath id='g0-105' d='M2.231631-4.483188L.498132-4.403487V-3.935243C1.085928-3.935243 1.155666-3.935243 1.155666-3.5467V-.468244H.468244V0C.777086-.009963 1.265255-.029888 1.683686-.029888C1.982565-.029888 2.49066-.009963 2.849315 0V-.468244H2.231631V-4.483188ZM2.331258-6.146949C2.331258-6.585305 1.972603-6.924035 1.554172-6.924035C1.125778-6.924035 .777086-6.575342 .777086-6.146949S1.125778-5.369863 1.554172-5.369863C1.972603-5.369863 2.331258-5.708593 2.331258-6.146949Z'/>\n\x3Cpath id='g0-110' d='M1.135741-3.5467V-.468244H.448319V0C.727273-.009963 1.325031-.029888 1.703611-.029888C2.092154-.029888 2.67995-.009963 2.958904 0V-.468244H2.271482V-2.550436C2.271482-3.636364 3.128269-4.124533 3.755915-4.124533C4.094645-4.124533 4.303861-3.915318 4.303861-3.158157V-.468244H3.616438V0C3.895392-.009963 4.493151-.029888 4.871731-.029888C5.260274-.029888 5.84807-.009963 6.127024 0V-.468244H5.439601V-3.048568C5.439601-4.094645 4.901619-4.483188 3.905355-4.483188C2.948941-4.483188 2.420922-3.915318 2.161893-3.407223V-4.483188L.448319-4.403487V-3.935243C1.066002-3.935243 1.135741-3.935243 1.135741-3.5467Z'/>\n\x3Cpath id='g0-111' d='M5.399751-2.171856C5.399751-3.506849 4.483188-4.513076 2.859278-4.513076C1.225405-4.513076 .318804-3.496887 .318804-2.171856C.318804-.936488 1.195517 .059776 2.859278 .059776C4.533001 .059776 5.399751-.946451 5.399751-2.171856ZM2.859278-.33873C1.594022-.33873 1.594022-1.414695 1.594022-2.281445C1.594022-2.729763 1.594022-3.237858 1.763387-3.576588C1.952677-3.945205 2.371108-4.154421 2.859278-4.154421C3.277709-4.154421 3.696139-3.995019 3.915318-3.646326C4.124533-3.307597 4.124533-2.759651 4.124533-2.281445C4.124533-1.414695 4.124533-.33873 2.859278-.33873Z'/>\n\x3Cpath id='g0-114' d='M2.022416-3.35741V-4.483188L.368618-4.403487V-3.935243C.986301-3.935243 1.05604-3.935243 1.05604-3.5467V-.468244H.368618V0C.71731-.009963 1.165629-.029888 1.62391-.029888C2.002491-.029888 2.6401-.029888 2.998755 0V-.468244H2.132005V-2.211706C2.132005-2.909091 2.381071-4.124533 3.377335-4.124533C3.367372-4.11457 3.188045-3.955168 3.188045-3.666252C3.188045-3.257783 3.506849-3.058531 3.795766-3.058531S4.403487-3.267746 4.403487-3.666252C4.403487-4.194271 3.865504-4.483188 3.347447-4.483188C2.650062-4.483188 2.251557-3.985056 2.022416-3.35741Z'/>\n\x3Cpath id='g0-117' d='M4.363636-.71731V.059776L6.127024 0V-.468244C5.50934-.468244 5.439601-.468244 5.439601-.856787V-4.483188L3.616438-4.403487V-3.935243C4.234122-3.935243 4.303861-3.935243 4.303861-3.5467V-1.643836C4.303861-.826899 3.795766-.298879 3.068493-.298879C2.30137-.298879 2.271482-.547945 2.271482-1.085928V-4.483188L.448319-4.403487V-3.935243C1.066002-3.935243 1.135741-3.935243 1.135741-3.5467V-1.225405C1.135741-.159402 1.942715 .059776 2.929016 .059776C3.188045 .059776 3.905355 .059776 4.363636-.71731Z'/>\n\x3C/defs>\n\x3Cg id='page1'>\n\x3Cuse x='364.932604' y='344.264063' xlink:href='#g0-83'/>\n\x3Cuse x='371.297591' y='344.264063' xlink:href='#g0-111'/>\n\x3Cuse x='377.026078' y='344.264063' xlink:href='#g0-117'/>\n\x3Cuse x='383.391065' y='344.264063' xlink:href='#g0-114'/>\n\x3Cuse x='388.10947' y='344.264063' xlink:href='#g0-99'/>\n\x3Cuse x='393.201459' y='344.264063' xlink:href='#g0-101'/>\n\x3Cuse x='402.271574' y='344.264063' xlink:href='#g0-67'/>\n\x3Cuse x='410.546056' y='344.264063' xlink:href='#g0-111'/>\n\x3Cuse x='416.592793' y='344.264063' xlink:href='#g0-100'/>\n\x3Cuse x='422.957779' y='344.264063' xlink:href='#g0-101'/>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 170.717 20.115L 170.717 10.963' fill='none' stroke='#0c0c0c' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='0.8'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 171.117 20.115C 172.217 18.615 173.877 17.955 174.037 17.955C 174.217 17.955 174.277 18.115 174.277 18.255C 174.277 18.475 174.177 18.515 174.077 18.575C 173.397 18.875 171.937 19.515 170.997 21.515C 170.877 21.755 170.857 21.795 170.717 21.795C 170.577 21.795 170.557 21.755 170.437 21.515C 169.497 19.515 168.037 18.875 167.357 18.575C 167.257 18.515 167.157 18.475 167.157 18.255C 167.157 18.115 167.217 17.955 167.397 17.955C 167.557 17.955 169.217 18.615 170.317 20.115L 171.117 20.115Z' fill='#0c0c0c'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 108.82 48.1012L 232.613 48.1012L 232.613 23.3424L 108.82 23.3424L 108.82 48.1012Z' fill='#80ffff' opacity='0.3'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 108.82 48.1012L 232.613 48.1012L 232.613 23.3424L 108.82 23.3424L 108.82 48.1012Z' fill='none' stroke='#000080' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1'/>\n\x3C/g>\n\x3Cuse x='361.161802' y='374.128299' xlink:href='#g1-76'/>\n\x3Cuse x='367.388471' y='374.128299' xlink:href='#g1-101'/>\n\x3Cuse x='371.816323' y='374.128299' xlink:href='#g1-120'/>\n\x3Cuse x='377.074411' y='374.128299' xlink:href='#g1-105'/>\n\x3Cuse x='379.841819' y='374.128299' xlink:href='#g1-99'/>\n\x3Cuse x='384.269671' y='374.128299' xlink:href='#g1-97'/>\n\x3Cuse x='389.25101' y='374.128299' xlink:href='#g1-108'/>\n\x3Cuse x='395.339293' y='374.128299' xlink:href='#g1-65'/>\n\x3Cuse x='402.811292' y='374.128299' xlink:href='#g1-110'/>\n\x3Cuse x='408.346109' y='374.128299' xlink:href='#g1-97'/>\n\x3Cuse x='413.327448' y='374.128299' xlink:href='#g1-108'/>\n\x3Cuse x='416.094857' y='374.128299' xlink:href='#g1-121'/>\n\x3Cuse x='421.352944' y='374.128299' xlink:href='#g1-115'/>\n\x3Cuse x='425.282662' y='374.128299' xlink:href='#g1-105'/>\n\x3Cuse x='428.05007' y='374.128299' xlink:href='#g1-115'/>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 170.717 68.0851L 170.717 48.1012' fill='none' stroke='#0c0c0c' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='0.8'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 171.117 68.0851C 172.217 66.5851 173.877 65.9251 174.037 65.9251C 174.217 65.9251 174.277 66.0851 174.277 66.2251C 174.277 66.4451 174.177 66.4851 174.077 66.5451C 173.397 66.8451 171.937 67.4851 170.997 69.4851C 170.877 69.7251 170.857 69.7651 170.717 69.7651C 170.577 69.7651 170.557 69.7251 170.437 69.4851C 169.497 67.4851 168.037 66.8451 167.357 66.5451C 167.257 66.4851 167.157 66.4451 167.157 66.2251C 167.157 66.0851 167.217 65.9251 167.397 65.9251C 167.557 65.9251 169.217 66.5851 170.317 68.0851L 171.117 68.0851Z' fill='#0c0c0c'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 108.82 94.5239L 232.613 94.5239L 232.613 69.7651L 108.82 69.7651L 108.82 94.5239Z' fill='#80ffff' opacity='0.3'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 108.82 94.5239L 232.613 94.5239L 232.613 69.7651L 108.82 69.7651L 108.82 94.5239Z' fill='none' stroke='#000080' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1'/>\n\x3C/g>\n\x3Cuse x='361.507704' y='420.377564' xlink:href='#g1-83'/>\n\x3Cuse x='367.042521' y='420.377564' xlink:href='#g1-121'/>\n\x3Cuse x='372.300608' y='420.377564' xlink:href='#g1-110'/>\n\x3Cuse x='377.558677' y='420.377564' xlink:href='#g1-116'/>\n\x3Cuse x='381.43305' y='420.377564' xlink:href='#g1-97'/>\n\x3Cuse x='386.414389' y='420.377564' xlink:href='#g1-120'/>\n\x3Cuse x='394.993352' y='420.377564' xlink:href='#g1-65'/>\n\x3Cuse x='402.465351' y='420.377564' xlink:href='#g1-110'/>\n\x3Cuse x='408.000168' y='420.377564' xlink:href='#g1-97'/>\n\x3Cuse x='412.981507' y='420.377564' xlink:href='#g1-108'/>\n\x3Cuse x='415.748915' y='420.377564' xlink:href='#g1-121'/>\n\x3Cuse x='421.007003' y='420.377564' xlink:href='#g1-115'/>\n\x3Cuse x='424.936721' y='420.377564' xlink:href='#g1-105'/>\n\x3Cuse x='427.704129' y='420.377564' xlink:href='#g1-115'/>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 170.717 114.508L 170.717 94.5239' fill='none' stroke='#0c0c0c' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='0.8'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 171.117 114.508C 172.217 113.008 173.877 112.348 174.037 112.348C 174.217 112.348 174.277 112.508 174.277 112.648C 174.277 112.868 174.177 112.908 174.077 112.968C 173.397 113.268 171.937 113.908 170.997 115.908C 170.877 116.148 170.857 116.188 170.717 116.188C 170.577 116.188 170.557 116.148 170.437 115.908C 169.497 113.908 168.037 113.268 167.357 112.968C 167.257 112.908 167.157 112.868 167.157 112.648C 167.157 112.508 167.217 112.348 167.397 112.348C 167.557 112.348 169.217 113.008 170.317 114.508L 171.117 114.508Z' fill='#0c0c0c'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 108.82 140.947L 232.613 140.947L 232.613 116.188L 108.82 116.188L 108.82 140.947Z' fill='#80ffff' opacity='0.3'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 108.82 140.947L 232.613 140.947L 232.613 116.188L 108.82 116.188L 108.82 140.947Z' fill='none' stroke='#000080' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1'/>\n\x3C/g>\n\x3Cuse x='356.803132' y='466.626828' xlink:href='#g1-83'/>\n\x3Cuse x='362.337949' y='466.626828' xlink:href='#g1-101'/>\n\x3Cuse x='366.765801' y='466.626828' xlink:href='#g1-109'/>\n\x3Cuse x='375.068026' y='466.626828' xlink:href='#g1-97'/>\n\x3Cuse x='380.049365' y='466.626828' xlink:href='#g1-110'/>\n\x3Cuse x='385.307434' y='466.626828' xlink:href='#g1-116'/>\n\x3Cuse x='389.181807' y='466.626828' xlink:href='#g1-105'/>\n\x3Cuse x='391.949216' y='466.626828' xlink:href='#g1-99'/>\n\x3Cuse x='399.697942' y='466.626828' xlink:href='#g1-65'/>\n\x3Cuse x='407.169942' y='466.626828' xlink:href='#g1-110'/>\n\x3Cuse x='412.704759' y='466.626828' xlink:href='#g1-97'/>\n\x3Cuse x='417.686098' y='466.626828' xlink:href='#g1-108'/>\n\x3Cuse x='420.453506' y='466.626828' xlink:href='#g1-121'/>\n\x3Cuse x='425.711594' y='466.626828' xlink:href='#g1-115'/>\n\x3Cuse x='429.641311' y='466.626828' xlink:href='#g1-105'/>\n\x3Cuse x='432.40872' y='466.626828' xlink:href='#g1-115'/>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 170.717 160.93L 170.717 140.947' fill='none' stroke='#0c0c0c' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='0.8'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 171.117 160.93C 172.217 159.43 173.877 158.77 174.037 158.77C 174.217 158.77 174.277 158.93 174.277 159.07C 174.277 159.29 174.177 159.33 174.077 159.39C 173.397 159.69 171.937 160.33 170.997 162.33C 170.877 162.57 170.857 162.61 170.717 162.61C 170.577 162.61 170.557 162.57 170.437 162.33C 169.497 160.33 168.037 159.69 167.357 159.39C 167.257 159.33 167.157 159.29 167.157 159.07C 167.157 158.93 167.217 158.77 167.397 158.77C 167.557 158.77 169.217 159.43 170.317 160.93L 171.117 160.93Z' fill='#0c0c0c'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 108.82 187.369L 232.613 187.369L 232.613 162.61L 108.82 162.61L 108.82 187.369Z' fill='#80ffff' opacity='0.3'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 108.82 187.369L 232.613 187.369L 232.613 162.61L 108.82 162.61L 108.82 187.369Z' fill='none' stroke='#000080' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1'/>\n\x3C/g>\n\x3Cuse x='356.014433' y='509.219744' xlink:href='#g1-73'/>\n\x3Cuse x='359.612058' y='509.219744' xlink:href='#g1-110'/>\n\x3Cuse x='364.870127' y='509.219744' xlink:href='#g1-116'/>\n\x3Cuse x='368.744501' y='509.219744' xlink:href='#g1-101'/>\n\x3Cuse x='373.172352' y='509.219744' xlink:href='#g1-114'/>\n\x3Cuse x='377.074403' y='509.219744' xlink:href='#g1-109'/>\n\x3Cuse x='385.376628' y='509.219744' xlink:href='#g1-101'/>\n\x3Cuse x='389.80448' y='509.219744' xlink:href='#g1-100'/>\n\x3Cuse x='395.339297' y='509.219744' xlink:href='#g1-105'/>\n\x3Cuse x='398.106705' y='509.219744' xlink:href='#g1-97'/>\n\x3Cuse x='403.088044' y='509.219744' xlink:href='#g1-116'/>\n\x3Cuse x='406.962418' y='509.219744' xlink:href='#g1-101'/>\n\x3Cuse x='414.711145' y='509.219744' xlink:href='#g1-67'/>\n\x3Cuse x='421.906405' y='509.219744' xlink:href='#g1-111'/>\n\x3Cuse x='427.164492' y='509.219744' xlink:href='#g1-100'/>\n\x3Cuse x='432.699309' y='509.219744' xlink:href='#g1-101'/>\n\x3Cuse x='372.445903' y='518.414253' xlink:href='#g1-71'/>\n\x3Cuse x='380.263828' y='518.414253' xlink:href='#g1-101'/>\n\x3Cuse x='384.69168' y='518.414253' xlink:href='#g1-110'/>\n\x3Cuse x='390.226497' y='518.414253' xlink:href='#g1-101'/>\n\x3Cuse x='394.654348' y='518.414253' xlink:href='#g1-114'/>\n\x3Cuse x='398.556399' y='518.414253' xlink:href='#g1-97'/>\n\x3Cuse x='403.537738' y='518.414253' xlink:href='#g1-116'/>\n\x3Cuse x='407.412112' y='518.414253' xlink:href='#g1-105'/>\n\x3Cuse x='410.17952' y='518.414253' xlink:href='#g1-111'/>\n\x3Cuse x='415.160859' y='518.414253' xlink:href='#g1-110'/>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 170.717 207.353L 170.717 187.369' fill='none' stroke='#0c0c0c' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='0.8'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 171.117 207.353C 172.217 205.853 173.877 205.193 174.037 205.193C 174.217 205.193 174.277 205.353 174.277 205.493C 174.277 205.713 174.177 205.753 174.077 205.813C 173.397 206.113 171.937 206.753 170.997 208.753C 170.877 208.993 170.857 209.033 170.717 209.033C 170.577 209.033 170.557 208.993 170.437 208.753C 169.497 206.753 168.037 206.113 167.357 205.813C 167.257 205.753 167.157 205.713 167.157 205.493C 167.157 205.353 167.217 205.193 167.397 205.193C 167.557 205.193 169.217 205.853 170.317 207.353L 171.117 207.353Z' fill='#0c0c0c'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 108.82 233.792L 232.613 233.792L 232.613 209.033L 108.82 209.033L 108.82 233.792Z' fill='#80ffff' opacity='0.3'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 108.82 233.792L 232.613 233.792L 232.613 209.033L 108.82 209.033L 108.82 233.792Z' fill='none' stroke='#000080' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1'/>\n\x3C/g>\n\x3Cuse x='354.921288' y='559.125341' xlink:href='#g1-67'/>\n\x3Cuse x='362.116548' y='559.125341' xlink:href='#g1-111'/>\n\x3Cuse x='367.374636' y='559.125341' xlink:href='#g1-100'/>\n\x3Cuse x='372.909453' y='559.125341' xlink:href='#g1-101'/>\n\x3Cuse x='380.658179' y='559.125341' xlink:href='#g1-79'/>\n\x3Cuse x='388.406927' y='559.125341' xlink:href='#g1-112'/>\n\x3Cuse x='393.941744' y='559.125341' xlink:href='#g1-116'/>\n\x3Cuse x='397.816118' y='559.125341' xlink:href='#g1-105'/>\n\x3Cuse x='400.583526' y='559.125341' xlink:href='#g1-109'/>\n\x3Cuse x='408.885752' y='559.125341' xlink:href='#g1-105'/>\n\x3Cuse x='411.65316' y='559.125341' xlink:href='#g1-122'/>\n\x3Cuse x='416.081012' y='559.125341' xlink:href='#g1-97'/>\n\x3Cuse x='421.062351' y='559.125341' xlink:href='#g1-116'/>\n\x3Cuse x='424.936724' y='559.125341' xlink:href='#g1-105'/>\n\x3Cuse x='427.704133' y='559.125341' xlink:href='#g1-111'/>\n\x3Cuse x='432.685472' y='559.125341' xlink:href='#g1-110'/>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 170.717 253.776L 170.717 233.792' fill='none' stroke='#0c0c0c' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='0.8'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 171.117 253.776C 172.217 252.276 173.877 251.616 174.037 251.616C 174.217 251.616 174.277 251.776 174.277 251.916C 174.277 252.136 174.177 252.176 174.077 252.236C 173.397 252.536 171.937 253.176 170.997 255.176C 170.877 255.416 170.857 255.456 170.717 255.456C 170.577 255.456 170.557 255.416 170.437 255.176C 169.497 253.176 168.037 252.536 167.357 252.236C 167.257 252.176 167.157 252.136 167.157 251.916C 167.157 251.776 167.217 251.616 167.397 251.616C 167.557 251.616 169.217 252.276 170.317 253.776L 171.117 253.776Z' fill='#0c0c0c'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 108.82 280.215L 232.613 280.215L 232.613 255.456L 108.82 255.456L 108.82 280.215Z' fill='#80ffff' opacity='0.3'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 108.82 280.215L 232.613 280.215L 232.613 255.456L 108.82 255.456L 108.82 280.215Z' fill='none' stroke='#000080' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1'/>\n\x3C/g>\n\x3Cuse x='359.577473' y='606.343187' xlink:href='#g1-67'/>\n\x3Cuse x='366.772733' y='606.343187' xlink:href='#g1-111'/>\n\x3Cuse x='372.03082' y='606.343187' xlink:href='#g1-100'/>\n\x3Cuse x='377.565637' y='606.343187' xlink:href='#g1-101'/>\n\x3Cuse x='385.314364' y='606.343187' xlink:href='#g1-71'/>\n\x3Cuse x='393.132289' y='606.343187' xlink:href='#g1-101'/>\n\x3Cuse x='397.560141' y='606.343187' xlink:href='#g1-110'/>\n\x3Cuse x='403.094957' y='606.343187' xlink:href='#g1-101'/>\n\x3Cuse x='407.522809' y='606.343187' xlink:href='#g1-114'/>\n\x3Cuse x='411.42486' y='606.343187' xlink:href='#g1-97'/>\n\x3Cuse x='416.406199' y='606.343187' xlink:href='#g1-116'/>\n\x3Cuse x='420.280572' y='606.343187' xlink:href='#g1-105'/>\n\x3Cuse x='423.047981' y='606.343187' xlink:href='#g1-111'/>\n\x3Cuse x='428.02932' y='606.343187' xlink:href='#g1-110'/>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 170.717 297.104L 170.717 280.215' fill='none' stroke='#0c0c0c' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='0.8'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 171.117 297.104C 172.217 295.604 173.877 294.944 174.037 294.944C 174.217 294.944 174.277 295.104 174.277 295.244C 174.277 295.464 174.177 295.504 174.077 295.564C 173.397 295.864 171.937 296.504 170.997 298.504C 170.877 298.744 170.857 298.784 170.717 298.784C 170.577 298.784 170.557 298.744 170.437 298.504C 169.497 296.504 168.037 295.864 167.357 295.564C 167.257 295.504 167.157 295.464 167.157 295.244C 167.157 295.104 167.217 294.944 167.397 294.944C 167.557 294.944 169.217 295.604 170.317 297.104L 171.117 297.104Z' fill='#0c0c0c'/>\n\x3C/g>\n\x3Cuse x='360.501346' y='643.342592' xlink:href='#g0-77'/>\n\x3Cuse x='371.377176' y='643.342592' xlink:href='#g0-97'/>\n\x3Cuse x='376.946529' y='643.342592' xlink:href='#g0-99'/>\n\x3Cuse x='381.720269' y='643.342592' xlink:href='#g0-104'/>\n\x3Cuse x='388.085255' y='643.342592' xlink:href='#g0-105'/>\n\x3Cuse x='391.267748' y='643.342592' xlink:href='#g0-110'/>\n\x3Cuse x='397.632735' y='643.342592' xlink:href='#g0-101'/>\n\x3Cuse x='406.70285' y='643.342592' xlink:href='#g0-67'/>\n\x3Cuse x='414.977332' y='643.342592' xlink:href='#g0-111'/>\n\x3Cuse x='421.024069' y='643.342592' xlink:href='#g0-100'/>\n\x3Cuse x='427.389055' y='643.342592' xlink:href='#g0-101'/>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 0.5 275.572L 93.3454 275.572L 93.3454 27.9847L 0.5 27.9847L 0.5 275.572Z' fill='#c0ffc0' opacity='0.2'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 0.5 275.572L 93.3454 275.572L 93.3454 27.9847L 0.5 27.9847L 0.5 275.572Z' fill='none' stroke='#004000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1'/>\n\x3C/g>\n\x3Cg fill='#004000' transform='matrix(0 -1 1 0 -214.022 760.5)'>\n\x3Cuse x='213.740161' y='489.751445' xlink:href='#g1-83'/>\n\x3Cuse x='219.274978' y='489.751445' xlink:href='#g1-121'/>\n\x3Cuse x='224.533066' y='489.751445' xlink:href='#g1-109'/>\n\x3Cuse x='232.558543' y='489.751445' xlink:href='#g1-98'/>\n\x3Cuse x='238.370108' y='489.751445' xlink:href='#g1-111'/>\n\x3Cuse x='243.351447' y='489.751445' xlink:href='#g1-108'/>\n\x3Cuse x='249.439731' y='489.751445' xlink:href='#g1-84'/>\n\x3Cuse x='255.804761' y='489.751445' xlink:href='#g1-97'/>\n\x3Cuse x='260.7861' y='489.751445' xlink:href='#g1-98'/>\n\x3Cuse x='266.320917' y='489.751445' xlink:href='#g1-108'/>\n\x3Cuse x='269.088325' y='489.751445' xlink:href='#g1-101'/>\n\x3Cuse x='276.837052' y='489.751445' xlink:href='#g1-77'/>\n\x3Cuse x='285.969494' y='489.751445' xlink:href='#g1-97'/>\n\x3Cuse x='290.950833' y='489.751445' xlink:href='#g1-110'/>\n\x3Cuse x='296.48565' y='489.751445' xlink:href='#g1-97'/>\n\x3Cuse x='301.466989' y='489.751445' xlink:href='#g1-103'/>\n\x3Cuse x='306.448328' y='489.751445' xlink:href='#g1-101'/>\n\x3Cuse x='310.87618' y='489.751445' xlink:href='#g1-109'/>\n\x3Cuse x='319.178405' y='489.751445' xlink:href='#g1-101'/>\n\x3Cuse x='323.606257' y='489.751445' xlink:href='#g1-110'/>\n\x3Cuse x='328.864325' y='489.751445' xlink:href='#g1-116'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 248.088 275.572L 340.933 275.572L 340.933 27.9847L 248.088 27.9847L 248.088 275.572Z' fill='#ffc0ff' opacity='0.2'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 248.088 275.572L 340.933 275.572L 340.933 27.9847L 248.088 27.9847L 248.088 275.572Z' fill='none' stroke='#ff0000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1'/>\n\x3C/g>\n\x3Cg fill='#f00' transform='matrix(0 1 -1 0 1007.163 -32.641)'>\n\x3Cuse x='486.720893' y='489.751445' xlink:href='#g1-69'/>\n\x3Cuse x='493.50104' y='489.751445' xlink:href='#g1-114'/>\n\x3Cuse x='497.403091' y='489.751445' xlink:href='#g1-114'/>\n\x3Cuse x='501.305141' y='489.751445' xlink:href='#g1-111'/>\n\x3Cuse x='506.28648' y='489.751445' xlink:href='#g1-114'/>\n\x3Cuse x='513.509406' y='489.751445' xlink:href='#g1-72'/>\n\x3Cuse x='520.981405' y='489.751445' xlink:href='#g1-97'/>\n\x3Cuse x='525.962744' y='489.751445' xlink:href='#g1-110'/>\n\x3Cuse x='531.497561' y='489.751445' xlink:href='#g1-100'/>\n\x3Cuse x='537.032378' y='489.751445' xlink:href='#g1-108'/>\n\x3Cuse x='539.799786' y='489.751445' xlink:href='#g1-105'/>\n\x3Cuse x='542.567195' y='489.751445' xlink:href='#g1-110'/>\n\x3Cuse x='548.102012' y='489.751445' xlink:href='#g1-103'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 104.045 35.7218L 93.3454 35.7218' fill='none' stroke='#0c0c0c' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='0.8'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 104.045 35.3218C 102.545 34.2218 101.885 32.5618 101.885 32.4018C 101.885 32.2218 102.045 32.1618 102.185 32.1618C 102.405 32.1618 102.445 32.2618 102.505 32.3618C 102.805 33.0418 103.445 34.5018 105.445 35.4418C 105.685 35.5618 105.725 35.5818 105.725 35.7218C 105.725 35.8618 105.685 35.8818 105.445 36.0018C 103.445 36.9418 102.805 38.4018 102.505 39.0818C 102.445 39.1818 102.405 39.2818 102.185 39.2818C 102.045 39.2818 101.885 39.2218 101.885 39.0418C 101.885 38.8818 102.545 37.2218 104.045 36.1218L 104.045 35.3218Z' fill='#0c0c0c'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 95.0254 40.3641L 105.725 40.3641' fill='none' stroke='#0c0c0c' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='0.8'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 95.0254 40.7641C 96.5254 41.8641 97.1854 43.5241 97.1854 43.6841C 97.1854 43.8641 97.0254 43.9241 96.8854 43.9241C 96.6654 43.9241 96.6254 43.8241 96.5654 43.7241C 96.2654 43.0441 95.6254 41.5841 93.6254 40.6441C 93.3854 40.5241 93.3454 40.5041 93.3454 40.3641C 93.3454 40.2241 93.3854 40.2041 93.6254 40.0841C 95.6254 39.1441 96.2654 37.6841 96.5654 37.0041C 96.6254 36.9041 96.6654 36.8041 96.8854 36.8041C 97.0254 36.8041 97.1854 36.8641 97.1854 37.0441C 97.1854 37.2041 96.5254 38.8641 95.0254 39.9641L 95.0254 40.7641Z' fill='#0c0c0c'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 246.408 35.7218L 235.708 35.7218' fill='none' stroke='#0c0c0c' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='0.8'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 246.408 35.3218C 244.908 34.2218 244.248 32.5618 244.248 32.4018C 244.248 32.2218 244.408 32.1618 244.548 32.1618C 244.768 32.1618 244.808 32.2618 244.868 32.3618C 245.168 33.0418 245.808 34.5018 247.808 35.4418C 248.048 35.5618 248.088 35.5818 248.088 35.7218C 248.088 35.8618 248.048 35.8818 247.808 36.0018C 245.808 36.9418 245.168 38.4018 244.868 39.0818C 244.808 39.1818 244.768 39.2818 244.548 39.2818C 244.408 39.2818 244.248 39.2218 244.248 39.0418C 244.248 38.8818 244.908 37.2218 246.408 36.1218L 246.408 35.3218Z' fill='#0c0c0c'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 104.045 82.1445L 93.3454 82.1445' fill='none' stroke='#0c0c0c' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='0.8'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 104.045 81.7445C 102.545 80.6445 101.885 78.9845 101.885 78.8245C 101.885 78.6445 102.045 78.5845 102.185 78.5845C 102.405 78.5845 102.445 78.6845 102.505 78.7845C 102.805 79.4645 103.445 80.9245 105.445 81.8645C 105.685 81.9845 105.725 82.0045 105.725 82.1445C 105.725 82.2845 105.685 82.3045 105.445 82.4245C 103.445 83.3645 102.805 84.8245 102.505 85.5045C 102.445 85.6045 102.405 85.7045 102.185 85.7045C 102.045 85.7045 101.885 85.6445 101.885 85.4645C 101.885 85.3045 102.545 83.6445 104.045 82.5445L 104.045 81.7445Z' fill='#0c0c0c'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 95.0254 86.7868L 105.725 86.7868' fill='none' stroke='#0c0c0c' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='0.8'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 95.0254 87.1868C 96.5254 88.2868 97.1854 89.9468 97.1854 90.1068C 97.1854 90.2868 97.0254 90.3468 96.8854 90.3468C 96.6654 90.3468 96.6254 90.2468 96.5654 90.1468C 96.2654 89.4668 95.6254 88.0068 93.6254 87.0668C 93.3854 86.9468 93.3454 86.9268 93.3454 86.7868C 93.3454 86.6468 93.3854 86.6268 93.6254 86.5068C 95.6254 85.5668 96.2654 84.1068 96.5654 83.4268C 96.6254 83.3268 96.6654 83.2268 96.8854 83.2268C 97.0254 83.2268 97.1854 83.2868 97.1854 83.4668C 97.1854 83.6268 96.5254 85.2868 95.0254 86.3868L 95.0254 87.1868Z' fill='#0c0c0c'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 246.408 82.1445L 235.708 82.1445' fill='none' stroke='#0c0c0c' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='0.8'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 246.408 81.7445C 244.908 80.6445 244.248 78.9845 244.248 78.8245C 244.248 78.6445 244.408 78.5845 244.548 78.5845C 244.768 78.5845 244.808 78.6845 244.868 78.7845C 245.168 79.4645 245.808 80.9245 247.808 81.8645C 248.048 81.9845 248.088 82.0045 248.088 82.1445C 248.088 82.2845 248.048 82.3045 247.808 82.4245C 245.808 83.3645 245.168 84.8245 244.868 85.5045C 244.808 85.6045 244.768 85.7045 244.548 85.7045C 244.408 85.7045 244.248 85.6445 244.248 85.4645C 244.248 85.3045 244.908 83.6445 246.408 82.5445L 246.408 81.7445Z' fill='#0c0c0c'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 104.045 128.567L 93.3454 128.567' fill='none' stroke='#0c0c0c' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='0.8'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 104.045 128.167C 102.545 127.067 101.885 125.407 101.885 125.247C 101.885 125.067 102.045 125.007 102.185 125.007C 102.405 125.007 102.445 125.107 102.505 125.207C 102.805 125.887 103.445 127.347 105.445 128.287C 105.685 128.407 105.725 128.427 105.725 128.567C 105.725 128.707 105.685 128.727 105.445 128.847C 103.445 129.787 102.805 131.247 102.505 131.927C 102.445 132.027 102.405 132.127 102.185 132.127C 102.045 132.127 101.885 132.067 101.885 131.887C 101.885 131.727 102.545 130.067 104.045 128.967L 104.045 128.167Z' fill='#0c0c0c'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 95.0254 133.209L 105.725 133.209' fill='none' stroke='#0c0c0c' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='0.8'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 95.0254 133.609C 96.5254 134.709 97.1854 136.369 97.1854 136.529C 97.1854 136.709 97.0254 136.769 96.8854 136.769C 96.6654 136.769 96.6254 136.669 96.5654 136.569C 96.2654 135.889 95.6254 134.429 93.6254 133.489C 93.3854 133.369 93.3454 133.349 93.3454 133.209C 93.3454 133.069 93.3854 133.049 93.6254 132.929C 95.6254 131.989 96.2654 130.529 96.5654 129.849C 96.6254 129.749 96.6654 129.649 96.8854 129.649C 97.0254 129.649 97.1854 129.709 97.1854 129.889C 97.1854 130.049 96.5254 131.709 95.0254 132.809L 95.0254 133.609Z' fill='#0c0c0c'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 246.408 128.567L 235.708 128.567' fill='none' stroke='#0c0c0c' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='0.8'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 246.408 128.167C 244.908 127.067 244.248 125.407 244.248 125.247C 244.248 125.067 244.408 125.007 244.548 125.007C 244.768 125.007 244.808 125.107 244.868 125.207C 245.168 125.887 245.808 127.347 247.808 128.287C 248.048 128.407 248.088 128.427 248.088 128.567C 248.088 128.707 248.048 128.727 247.808 128.847C 245.808 129.787 245.168 131.247 244.868 131.927C 244.808 132.027 244.768 132.127 244.548 132.127C 244.408 132.127 244.248 132.067 244.248 131.887C 244.248 131.727 244.908 130.067 246.408 128.967L 246.408 128.167Z' fill='#0c0c0c'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 104.045 174.99L 93.3454 174.99' fill='none' stroke='#0c0c0c' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='0.8'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 104.045 174.59C 102.545 173.49 101.885 171.83 101.885 171.67C 101.885 171.49 102.045 171.43 102.185 171.43C 102.405 171.43 102.445 171.53 102.505 171.63C 102.805 172.31 103.445 173.77 105.445 174.71C 105.685 174.83 105.725 174.85 105.725 174.99C 105.725 175.13 105.685 175.15 105.445 175.27C 103.445 176.21 102.805 177.67 102.505 178.35C 102.445 178.45 102.405 178.55 102.185 178.55C 102.045 178.55 101.885 178.49 101.885 178.31C 101.885 178.15 102.545 176.49 104.045 175.39L 104.045 174.59Z' fill='#0c0c0c'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 95.0254 179.632L 105.725 179.632' fill='none' stroke='#0c0c0c' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='0.8'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 95.0254 180.032C 96.5254 181.132 97.1854 182.792 97.1854 182.952C 97.1854 183.132 97.0254 183.192 96.8854 183.192C 96.6654 183.192 96.6254 183.092 96.5654 182.992C 96.2654 182.312 95.6254 180.852 93.6254 179.912C 93.3854 179.792 93.3454 179.772 93.3454 179.632C 93.3454 179.492 93.3854 179.472 93.6254 179.352C 95.6254 178.412 96.2654 176.952 96.5654 176.272C 96.6254 176.172 96.6654 176.072 96.8854 176.072C 97.0254 176.072 97.1854 176.132 97.1854 176.312C 97.1854 176.472 96.5254 178.132 95.0254 179.232L 95.0254 180.032Z' fill='#0c0c0c'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 246.408 174.99L 235.708 174.99' fill='none' stroke='#0c0c0c' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='0.8'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 246.408 174.59C 244.908 173.49 244.248 171.83 244.248 171.67C 244.248 171.49 244.408 171.43 244.548 171.43C 244.768 171.43 244.808 171.53 244.868 171.63C 245.168 172.31 245.808 173.77 247.808 174.71C 248.048 174.83 248.088 174.85 248.088 174.99C 248.088 175.13 248.048 175.15 247.808 175.27C 245.808 176.21 245.168 177.67 244.868 178.35C 244.808 178.45 244.768 178.55 244.548 178.55C 244.408 178.55 244.248 178.49 244.248 178.31C 244.248 178.15 244.908 176.49 246.408 175.39L 246.408 174.59Z' fill='#0c0c0c'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 104.045 221.413L 93.3454 221.413' fill='none' stroke='#0c0c0c' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='0.8'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 104.045 221.013C 102.545 219.913 101.885 218.253 101.885 218.093C 101.885 217.913 102.045 217.853 102.185 217.853C 102.405 217.853 102.445 217.953 102.505 218.053C 102.805 218.733 103.445 220.193 105.445 221.133C 105.685 221.253 105.725 221.273 105.725 221.413C 105.725 221.553 105.685 221.573 105.445 221.693C 103.445 222.633 102.805 224.093 102.505 224.773C 102.445 224.873 102.405 224.973 102.185 224.973C 102.045 224.973 101.885 224.913 101.885 224.733C 101.885 224.573 102.545 222.913 104.045 221.813L 104.045 221.013Z' fill='#0c0c0c'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 95.0254 226.055L 105.725 226.055' fill='none' stroke='#0c0c0c' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='0.8'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 95.0254 226.455C 96.5254 227.555 97.1854 229.215 97.1854 229.375C 97.1854 229.555 97.0254 229.615 96.8854 229.615C 96.6654 229.615 96.6254 229.515 96.5654 229.415C 96.2654 228.735 95.6254 227.275 93.6254 226.335C 93.3854 226.215 93.3454 226.195 93.3454 226.055C 93.3454 225.915 93.3854 225.895 93.6254 225.775C 95.6254 224.835 96.2654 223.375 96.5654 222.695C 96.6254 222.595 96.6654 222.495 96.8854 222.495C 97.0254 222.495 97.1854 222.555 97.1854 222.735C 97.1854 222.895 96.5254 224.555 95.0254 225.655L 95.0254 226.455Z' fill='#0c0c0c'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 246.408 221.413L 235.708 221.413' fill='none' stroke='#0c0c0c' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='0.8'/>\n\x3C/g>\n\x3Cg transform='translate(226.488 336.109)scale(.996264)'>\n\x3Cpath d='M 246.408 221.013C 244.908 219.913 244.248 218.253 244.248 218.093C 244.248 217.913 244.408 217.853 244.548 217.853C 244.768 217.853 244.808 217.953 244.868 218.053C 245.168 218.733 245.808 220.193 247.808 221.133C 248.048 221.253 248.088 221.273 248.088 221.413C 248.088 221.553 248.048 221.573 247.808 22",type:"svgGraphic"},uuid:"0|12"},$R[334]={content:$R[335]={type:"text",text:"Let's break down each of these phases."},uuid:"0|13"},$R[336]={content:$R[337]={type:"blockquoteWithCitation",text:"A compiler is a program that converts the entire source code of a programming language into executable machine code for a CPU.",assetId:3074710},uuid:"0|14"},$R[338]={content:$R[339]={type:"text",text:"**1. Lexical Analysis**\nAlso known as scanning, this is the first phase. The lexical analyzer reads the stream of characters in your source code and groups them into meaningful sequences called *lexemes*. For each lexeme, the analyzer produces a *token*. \n\nThink of it as breaking an English sentence down into words and punctuation. For the code `result = score + 10;`, the tokens would be:\n* `result` (identifier)\n* `=` (assignment operator)\n* `score` (identifier)\n* `+` (addition operator)\n* `10` (number)\n* `;` (semicolon)"},uuid:"0|15"},$R[340]={content:$R[341]={type:"text",text:"**2. Syntax Analysis**\nAlso called parsing, this phase takes the tokens from the lexical analyzer and checks if they form a grammatically correct statement according to the language's rules. It's like checking if a sequence of words forms a valid sentence. \n\nThe parser builds a tree-like data structure called a parse tree or syntax tree. This tree represents the grammatical structure of the token sequence. If the structure is invalid (like writing `+ 10 = score;`), the parser will generate a syntax error."},uuid:"0|16"},$R[342]={content:$R[343]={type:"text",text:"**3. Semantic Analysis**\nJust because a sentence is grammatically correct doesn't mean it makes sense. \"The apple ate the boy\" is syntactically valid, but semantically nonsensical. The semantic analyzer's job is to check for meaning. \n\nIt performs checks like making sure you're not trying to add a string to an integer, or using a variable that hasn't been declared. It ensures the code follows the \"meaning\" rules of the language."},uuid:"0|17"},$R[344]={content:$R[345]={type:"text",text:"**4. Intermediate Code Generation**\nAfter the code has been checked for syntax and semantic correctness, the compiler generates an intermediate representation of the source code. This intermediate code is machine-independent, meaning it doesn't rely on any specific CPU architecture. It's a stepping stone between the high-level language and the low-level machine code, making the next steps easier."},uuid:"0|18"},$R[346]={content:$R[347]={type:"text",text:"**5. Code Optimization**\nThe optimization phase is all about making the code better. It takes the intermediate code and tries to improve it so it runs faster and/or takes up less space. It might remove unnecessary steps or restructure calculations to be more efficient, all without changing the program's final output. Think of it as an editor who refines a clunky paragraph to be more concise and clear."},uuid:"0|19"},$R[348]={content:$R[349]={type:"text",text:"**6. Code Generation**\nThis is the final phase. The code generator takes the optimized intermediate code and translates it into the target machine's specific assembly or machine language. The result is the executable code that the computer's processor can finally understand and run."},uuid:"0|20"},$R[350]={content:$R[351]={type:"text",text:"Now let's test your understanding of these core concepts."},uuid:"0|21"},$R[352]={content:$R[353]={type:"quiz",questions:$R[354]=[$R[355]={text:"What is the primary difference between how a compiler and an interpreter work?",options:$R[356]=[$R[357]={text:"A compiler translates the entire program into machine code before it is run, while an interpreter translates and executes it one line at a time.",followup:"Correct. A compiler creates a complete, standalone executable file, whereas an interpreter works through the code sequentially during runtime.",isRightAnswer:!0},$R[358]={text:"Only interpreters check for errors in the code; compilers do not.",followup:"Incorrect. Both compilers and interpreters check for errors, just at different stages and in different ways.",isRightAnswer:!1},$R[359]={text:"Compilers are used for simple scripts, while interpreters are used for large, complex applications.",followup:"Incorrect. This is generally the opposite of typical use cases. Compiled languages are often preferred for performance in large applications.",isRightAnswer:!1},$R[360]={text:"An interpreter produces an executable file (.exe), while a compiler does not.",followup:"Incorrect. It's the other way around. A compiler's main output is an executable file.",isRightAnswer:!1}]},$R[361]={text:"Which phase of compilation is responsible for grouping characters from the source code into meaningful sequences called tokens?",options:$R[362]=[$R[363]={text:"Syntax Analysis",followup:"Incorrect. Syntax analysis, or parsing, takes the tokens and checks if they form a grammatically correct statement.",isRightAnswer:!1},$R[364]={text:"Semantic Analysis",followup:"Incorrect. Semantic analysis checks the tokens for meaning and context, such as type checking.",isRightAnswer:!1},$R[365]={text:"Lexical Analysis",followup:"Correct. The lexical analyzer, or scanner, is the first phase and is responsible for creating tokens from the raw source code.",isRightAnswer:!0},$R[366]={text:"Code Generation",followup:"Incorrect. Code generation is the final phase where the target machine code is created.",isRightAnswer:!1}]},$R[367]={text:"A line of code like `car + 5;` is grammatically valid in some languages (noun verb noun), but nonsensical if the `car` variable is not a number. Which compiler phase would catch this 'meaning' error?",options:$R[368]=[$R[369]={text:"Code Optimization",followup:"Incorrect. The code optimization phase works on improving code that has already been verified as syntactically and semantically correct.",isRightAnswer:!1},$R[370]={text:"Syntax Analysis",followup:"Incorrect. The syntax analyzer would confirm that the structure 'identifier operator literal;' is grammatically valid. It doesn't check the types.",isRightAnswer:!1},$R[371]={text:"Semantic Analysis",followup:"Correct. The semantic analyzer is responsible for checking the meaning and context of the code, including type compatibility (e.g., you can't add a car object to a number).",isRightAnswer:!0},$R[372]={text:"Lexical Analysis",followup:"Incorrect. The lexical analyzer would successfully create tokens for 'car', '+', '5', and ';', but it doesn't know their meaning.",isRightAnswer:!1}]},$R[373]={text:"The main purpose of the Code Optimization phase is to produce code that is semantically identical to the original but is more efficient.",options:$R[374]=[$R[375]={text:"True",followup:"Correct. The goal of optimization is to make the code run faster or use less memory without changing what the program actually does.",isRightAnswer:!0},$R[376]={text:"False",followup:"Incorrect. The optimizer's key role is to improve performance. It refactors the intermediate code into a more efficient version.",isRightAnswer:!1}]},$R[377]={text:"What is the final output of the entire compilation process?",options:$R[378]=[$R[379]={text:"Machine-specific executable code",followup:"Correct. The final phase, Code Generation, produces executable machine code that can be run directly by the computer's processor.",isRightAnswer:!0},$R[380]={text:"A list of tokens",followup:"Incorrect. Tokens are the output of the very first phase, Lexical Analysis.",isRightAnswer:!1},$R[381]={text:"A Syntax Tree",followup:"Incorrect. A syntax tree is a data structure created during the Syntax Analysis phase to represent the code's grammatical structure.",isRightAnswer:!1},$R[382]={text:"Intermediate Code",followup:"Incorrect. Intermediate code is a temporary representation used between the analysis and generation phases.",isRightAnswer:!1}]}]},uuid:"0|22"},$R[383]={content:$R[384]={type:"text",text:"Understanding these phases provides a solid foundation for how programming languages are brought to life by the machines that run them."},uuid:"0|23"}]},$R[385]={uuid:"1",title:"Lexical Analysis",includesKnowledgeBase:!1,hasDemonstratedMastery:!1,streaming:!1,blocks:$R[386]=[$R[387]={content:$R[388]={type:"header",text:"Breaking Code into Words"},uuid:"1|0"},$R[389]={content:$R[390]={type:"text",text:"When a compiler looks at your source code, it doesn't see functions, variables, or logic. At first, it just sees a long stream of characters. The very first job is to chop this stream into meaningful pieces, much like how we break a sentence into words and punctuation. This process is called lexical analysis."},uuid:"1|1"},$R[391]={content:$R[392]={type:"text",text:"The part of the compiler that does this is called a lexical analyzer, or scanner. It reads the code character by character and groups them into sequences called lexemes. Each lexeme is then categorized into a token. Think of tokens as the basic vocabulary of the programming language."},uuid:"1|2"},$R[393]={content:$R[394]={type:"header",text:"Tokens, Lexemes, and Patterns"},uuid:"1|3"},$R[395]={content:$R[396]={type:"text",text:"Let's clarify these three key terms. They're the foundation of this whole phase."},uuid:"1|4"},$R[397]={content:$R[398]={type:"definition",term:"Lexeme",definition:"A sequence of characters in the source code that matches the pattern for a token.",syllables:$R[399]=["lex","eme"],phonetic:"/ˈlɛksiːm/",partOfSpeech:"noun",exampleUsage:"In the code `count = 10;`, the character sequences `count`, `=`, `10`, and `;` are all lexemes."},uuid:"1|5"},$R[400]={content:$R[401]={type:"definition",term:"Token",definition:"A pair consisting of a token name and an optional attribute value. It's an abstract symbol representing a kind of lexical unit.",syllables:$R[402]=["to","ken"],phonetic:"/ˈtoʊkən/",partOfSpeech:"noun",exampleUsage:"The lexeme `count` might be mapped to the token `\x3Cidentifier, \"count\">`."},uuid:"1|6"},$R[403]={content:$R[404]={type:"definition",term:"Pattern",definition:"A rule describing the set of lexemes that can represent a particular token.",syllables:$R[405]=["pat","tern"],phonetic:"/ˈpætərn/",partOfSpeech:"noun",exampleUsage:"The pattern for an identifier in many languages is a letter followed by any number of letters or digits."},uuid:"1|7"},$R[406]={content:$R[407]={type:"text",text:"Consider this simple line of code:"},uuid:"1|8"},$R[408]={content:$R[409]={type:"code",markdown:"```\nresult = initial + 100;\n```"},uuid:"1|9"},$R[410]={content:$R[411]={type:"text",text:"The lexical analyzer scans this and breaks it down. Here’s how the lexemes map to tokens:"},uuid:"1|10"},$R[412]={content:$R[413]={type:"table",markdown:"| Lexeme | Token Name | Attribute Value |\n|---|---|---|\n| `result` | identifier | \"result\" |\n| `=` | assignment_operator | null |\n| `initial` | identifier | \"initial\" |\n| `+` | add_operator | null |\n| `100` | number | 100 |\n| `;` | semicolon | null |"},uuid:"1|11"},$R[414]={content:$R[415]={type:"text",text:"The scanner's output is a stream of these tokens. The next phase of the compiler, the syntax analyzer, will use this stream to check if the code is grammatically correct. The attribute values, like the name of the identifier or the value of the number, are carried along but aren't needed for the grammatical check itself."},uuid:"1|12"},$R[416]={content:$R[417]={type:"header",text:"Using Patterns to Find Tokens"},uuid:"1|13"},$R[418]={content:$R[419]={type:"text",text:"How does the scanner know that `result` is an identifier and `100` is a number? It uses patterns. These patterns are formally described using a powerful and concise notation called regular expressions."},uuid:"1|14"},$R[420]={content:$R[421]={type:"text",text:"Regular expressions are a way to specify a set of strings. For a programming language, we can write regular expressions for each token type."},uuid:"1|15"},$R[422]={content:$R[423]={type:"blockquote",text:"* **Identifier**: A letter, followed by zero or more letters or digits. We could write this as `letter(letter|digit)*`.\n* **Number**: One or more digits. We could write this as `digit+`.\n* **Whitespace**: One or more spaces, tabs, or newlines. Scanners usually recognize whitespace to discard it."},uuid:"1|16"},$R[424]={content:$R[425]={type:"text",text:"The lexical analyzer is built to recognize the strings described by these regular expressions. To do this efficiently, the regular expressions are often converted into a structure called a finite automaton."},uuid:"1|17"},$R[426]={content:$R[427]={type:"header",text:"The Recognizer Machine"},uuid:"1|18"},$R[428]={content:$R[429]={type:"text",text:"A finite automaton, or finite state machine, is a simple abstract machine that can recognize patterns. It has a set of states and transitions between them based on input characters. It reads an input string one character at a time, moving from state to state."},uuid:"1|19"},$R[430]={content:$R[431]={type:"text",text:"If it ends in a special "},uuid:"1|20"},$R[432]={content:$R[433]={svgMarkup:"\x3C?xml version='1.0' encoding='UTF-8'?>\n\x3C!-- This file was generated by dvisvgm 2.11.1 -->\n\x3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='226.771653pt' height='50.513927pt' viewBox='99.018935 67.51696 226.771653 50.513927'>\n\x3Cdefs>\n\x3Cpath id='g2-12' d='M3.287671-3.985056C3.745953-3.985056 3.815691-3.855542 3.815691-3.447073V-.757161C3.815691-.308842 3.706102-.308842 3.038605-.308842V0C3.367372-.009963 3.895392-.029888 4.144458-.029888S4.881694-.009963 5.250311 0V-.308842C4.582814-.308842 4.473225-.308842 4.473225-.757161V-4.41345L3.217933-4.323786C3.058531-4.313823 3.048568-4.303861 3.038605-4.303861C3.01868-4.293898 2.998755-4.293898 2.859278-4.293898H1.683686V-5.419676C1.683686-6.405978 2.540473-6.804483 3.158157-6.804483C3.457036-6.804483 3.815691-6.704857 4.014944-6.475716C3.606476-6.455791 3.5467-6.176837 3.5467-6.017435C3.5467-5.688667 3.805729-5.559153 3.995019-5.559153C4.224159-5.559153 4.4533-5.718555 4.4533-6.017435C4.4533-6.60523 3.905355-7.023661 3.16812-7.023661C2.241594-7.023661 1.05604-6.515567 1.05604-5.429639V-4.293898H.268991V-3.985056H1.05604V-.757161C1.05604-.308842 .946451-.308842 .278954-.308842V0C.607721-.009963 1.135741-.029888 1.384807-.029888S2.122042-.009963 2.49066 0V-.308842C1.823163-.308842 1.713574-.308842 1.713574-.757161V-3.985056H3.287671Z'/>\n\x3Cpath id='g2-44' d='M2.022416-.009963C2.022416-.647572 1.783313-1.05604 1.384807-1.05604C1.036115-1.05604 .856787-.787049 .856787-.52802S1.026152 0 1.384807 0C1.544209 0 1.663761-.059776 1.763387-.139477L1.783313-.159402C1.793275-.159402 1.803238-.14944 1.803238-.009963C1.803238 .627646 1.524284 1.235367 1.085928 1.703611C1.026152 1.763387 1.016189 1.77335 1.016189 1.8132C1.016189 1.882939 1.066002 1.92279 1.115816 1.92279C1.235367 1.92279 2.022416 1.135741 2.022416-.009963Z'/>\n\x3Cpath id='g2-65' d='M3.965131-6.933998C3.915318-7.063512 3.895392-7.13325 3.73599-7.13325S3.5467-7.073474 3.496887-6.933998L1.43462-.976339C1.255293-.468244 .856787-.318804 .318804-.308842V0C.547945-.009963 .976339-.029888 1.334994-.029888C1.643836-.029888 2.161893-.009963 2.480697 0V-.308842C1.982565-.308842 1.733499-.557908 1.733499-.816936C1.733499-.846824 1.743462-.946451 1.753425-.966376L2.211706-2.271482H4.672478L5.200498-.747198C5.210461-.707347 5.230386-.647572 5.230386-.607721C5.230386-.308842 4.672478-.308842 4.403487-.308842V0C4.762142-.029888 5.459527-.029888 5.838107-.029888C6.266501-.029888 6.724782-.019925 7.143213 0V-.308842H6.963885C6.366127-.308842 6.22665-.37858 6.117061-.707347L3.965131-6.933998ZM3.437111-5.818182L4.562889-2.580324H2.321295L3.437111-5.818182Z'/>\n\x3Cpath id='g2-70' d='M5.798257-6.774595H.328767V-6.465753H.56787C1.334994-6.465753 1.354919-6.356164 1.354919-5.997509V-.777086C1.354919-.418431 1.334994-.308842 .56787-.308842H.328767V0C.67746-.029888 1.454545-.029888 1.843088-.029888C2.251557-.029888 3.158157-.029888 3.516812 0V-.308842H3.188045C2.241594-.308842 2.241594-.438356 2.241594-.787049V-3.237858H3.098381C4.054795-3.237858 4.154421-2.919054 4.154421-2.072229H4.403487V-4.712329H4.154421C4.154421-3.875467 4.054795-3.5467 3.098381-3.5467H2.241594V-6.067248C2.241594-6.396015 2.261519-6.465753 2.729763-6.465753H3.92528C5.419676-6.465753 5.668742-5.907846 5.828144-4.533001H6.07721L5.798257-6.774595Z'/>\n\x3Cpath id='g2-73' d='M2.241594-6.027397C2.241594-6.386052 2.271482-6.495641 3.058531-6.495641H3.317559V-6.804483C2.968867-6.774595 2.181818-6.774595 1.803238-6.774595C1.414695-6.774595 .627646-6.774595 .278954-6.804483V-6.495641H.537983C1.325031-6.495641 1.354919-6.386052 1.354919-6.027397V-.777086C1.354919-.418431 1.325031-.308842 .537983-.308842H.278954V0C.627646-.029888 1.414695-.029888 1.793275-.029888C2.181818-.029888 2.968867-.029888 3.317559 0V-.308842H3.058531C2.271482-.308842 2.241594-.418431 2.241594-.777086V-6.027397Z'/>\n\x3Cpath id='g2-97' d='M3.317559-.757161C3.35741-.358655 3.626401 .059776 4.094645 .059776C4.303861 .059776 4.911582-.079701 4.911582-.886675V-1.444583H4.662516V-.886675C4.662516-.308842 4.41345-.249066 4.303861-.249066C3.975093-.249066 3.935243-.697385 3.935243-.747198V-2.739726C3.935243-3.158157 3.935243-3.5467 3.576588-3.915318C3.188045-4.303861 2.689913-4.463263 2.211706-4.463263C1.39477-4.463263 .707347-3.995019 .707347-3.337484C.707347-3.038605 .9066-2.86924 1.165629-2.86924C1.444583-2.86924 1.62391-3.068493 1.62391-3.327522C1.62391-3.447073 1.574097-3.775841 1.115816-3.785803C1.384807-4.134496 1.872976-4.244085 2.191781-4.244085C2.67995-4.244085 3.247821-3.855542 3.247821-2.968867V-2.600249C2.739726-2.570361 2.042341-2.540473 1.414695-2.241594C.667497-1.902864 .418431-1.384807 .418431-.946451C.418431-.139477 1.384807 .109589 2.012453 .109589C2.669988 .109589 3.128269-.288917 3.317559-.757161ZM3.247821-2.391034V-1.39477C3.247821-.448319 2.530511-.109589 2.082192-.109589C1.594022-.109589 1.185554-.458281 1.185554-.956413C1.185554-1.504359 1.603985-2.331258 3.247821-2.391034Z'/>\n\x3Cpath id='g2-100' d='M3.785803-.547945V.109589L5.250311 0V-.308842C4.552927-.308842 4.473225-.37858 4.473225-.86675V-6.914072L3.038605-6.804483V-6.495641C3.73599-6.495641 3.815691-6.425903 3.815691-5.937733V-3.785803C3.526775-4.144458 3.098381-4.403487 2.560399-4.403487C1.384807-4.403487 .33873-3.427148 .33873-2.141968C.33873-.876712 1.315068 .109589 2.450809 .109589C3.088418 .109589 3.536737-.229141 3.785803-.547945ZM3.785803-3.217933V-1.175592C3.785803-.996264 3.785803-.976339 3.676214-.806974C3.377335-.328767 2.929016-.109589 2.500623-.109589C2.052304-.109589 1.693649-.368618 1.454545-.747198C1.195517-1.155666 1.165629-1.723537 1.165629-2.132005C1.165629-2.500623 1.185554-3.098381 1.474471-3.5467C1.683686-3.855542 2.062267-4.184309 2.600249-4.184309C2.948941-4.184309 3.367372-4.034869 3.676214-3.58655C3.785803-3.417186 3.785803-3.39726 3.785803-3.217933Z'/>\n\x3Cpath id='g2-101' d='M1.115816-2.510585C1.175592-3.995019 2.012453-4.244085 2.351183-4.244085C3.377335-4.244085 3.476961-2.899128 3.476961-2.510585H1.115816ZM1.105853-2.30137H3.88543C4.104608-2.30137 4.134496-2.30137 4.134496-2.510585C4.134496-3.496887 3.596513-4.463263 2.351183-4.463263C1.195517-4.463263 .278954-3.437111 .278954-2.191781C.278954-.856787 1.325031 .109589 2.470735 .109589C3.686177 .109589 4.134496-.996264 4.134496-1.185554C4.134496-1.285181 4.054795-1.305106 4.004981-1.305106C3.915318-1.305106 3.895392-1.24533 3.875467-1.165629C3.526775-.139477 2.630137-.139477 2.530511-.139477C2.032379-.139477 1.633873-.438356 1.404732-.806974C1.105853-1.285181 1.105853-1.942715 1.105853-2.30137Z'/>\n\x3Cpath id='g2-102' d='M1.743462-4.293898V-5.449564C1.743462-6.326276 2.221669-6.804483 2.660025-6.804483C2.689913-6.804483 2.839352-6.804483 2.988792-6.734745C2.86924-6.694894 2.689913-6.56538 2.689913-6.316314C2.689913-6.087173 2.849315-5.88792 3.118306-5.88792C3.407223-5.88792 3.556663-6.087173 3.556663-6.326276C3.556663-6.694894 3.188045-7.023661 2.660025-7.023661C1.96264-7.023661 1.115816-6.495641 1.115816-5.439601V-4.293898H.328767V-3.985056H1.115816V-.757161C1.115816-.308842 1.006227-.308842 .33873-.308842V0C.727273-.009963 1.195517-.029888 1.474471-.029888C1.872976-.029888 2.34122-.029888 2.739726 0V-.308842H2.530511C1.793275-.308842 1.77335-.418431 1.77335-.777086V-3.985056H2.909091V-4.293898H1.743462Z'/>\n\x3Cpath id='g2-103' d='M2.211706-1.713574C1.344956-1.713574 1.344956-2.709838 1.344956-2.938979C1.344956-3.20797 1.354919-3.526775 1.504359-3.775841C1.58406-3.895392 1.8132-4.174346 2.211706-4.174346C3.078456-4.174346 3.078456-3.178082 3.078456-2.948941C3.078456-2.67995 3.068493-2.361146 2.919054-2.11208C2.839352-1.992528 2.610212-1.713574 2.211706-1.713574ZM1.05604-1.325031C1.05604-1.364882 1.05604-1.594022 1.225405-1.793275C1.613948-1.514321 2.022416-1.484433 2.211706-1.484433C3.138232-1.484433 3.825654-2.171856 3.825654-2.938979C3.825654-3.307597 3.666252-3.676214 3.417186-3.905355C3.775841-4.244085 4.134496-4.293898 4.313823-4.293898C4.333748-4.293898 4.383562-4.293898 4.41345-4.283935C4.303861-4.244085 4.254047-4.134496 4.254047-4.014944C4.254047-3.845579 4.383562-3.726027 4.542964-3.726027C4.64259-3.726027 4.83188-3.795766 4.83188-4.024907C4.83188-4.194271 4.712329-4.513076 4.323786-4.513076C4.124533-4.513076 3.686177-4.4533 3.267746-4.044832C2.849315-4.373599 2.430884-4.403487 2.211706-4.403487C1.285181-4.403487 .597758-3.716065 .597758-2.948941C.597758-2.510585 .816936-2.132005 1.066002-1.92279C.936488-1.77335 .757161-1.444583 .757161-1.09589C.757161-.787049 .886675-.408468 1.195517-.209215C.597758-.039851 .278954 .388543 .278954 .787049C.278954 1.504359 1.265255 2.052304 2.480697 2.052304C3.656289 2.052304 4.692403 1.544209 4.692403 .767123C4.692403 .418431 4.552927-.089664 4.044832-.368618C3.516812-.647572 2.938979-.647572 2.331258-.647572C2.082192-.647572 1.653798-.647572 1.58406-.657534C1.265255-.697385 1.05604-1.006227 1.05604-1.325031ZM2.49066 1.823163C1.484433 1.823163 .797011 1.315068 .797011 .787049C.797011 .328767 1.175592-.039851 1.613948-.069738H2.201743C3.058531-.069738 4.174346-.069738 4.174346 .787049C4.174346 1.325031 3.466999 1.823163 2.49066 1.823163Z'/>\n\x3Cpath id='g2-105' d='M1.763387-4.403487L.368618-4.293898V-3.985056C1.016189-3.985056 1.105853-3.92528 1.105853-3.437111V-.757161C1.105853-.308842 .996264-.308842 .328767-.308842V0C.647572-.009963 1.185554-.029888 1.424658-.029888C1.77335-.029888 2.122042-.009963 2.460772 0V-.308842C1.803238-.308842 1.763387-.358655 1.763387-.747198V-4.403487ZM1.803238-6.136986C1.803238-6.455791 1.554172-6.665006 1.275218-6.665006C.966376-6.665006 .747198-6.396015 .747198-6.136986C.747198-5.867995 .966376-5.608966 1.275218-5.608966C1.554172-5.608966 1.803238-5.818182 1.803238-6.136986Z'/>\n\x3Cpath id='g2-108' d='M1.763387-6.914072L.328767-6.804483V-6.495641C1.026152-6.495641 1.105853-6.425903 1.105853-5.937733V-.757161C1.105853-.308842 .996264-.308842 .328767-.308842V0C.657534-.009963 1.185554-.029888 1.43462-.029888S2.171856-.009963 2.540473 0V-.308842C1.872976-.308842 1.763387-.308842 1.763387-.757161V-6.914072Z'/>\n\x3Cpath id='g2-109' d='M1.09589-3.427148V-.757161C1.09589-.308842 .986301-.308842 .318804-.308842V0C.667497-.009963 1.175592-.029888 1.444583-.029888C1.703611-.029888 2.221669-.009963 2.560399 0V-.308842C1.892902-.308842 1.783313-.308842 1.783313-.757161V-2.590286C1.783313-3.626401 2.49066-4.184309 3.128269-4.184309C3.755915-4.184309 3.865504-3.646326 3.865504-3.078456V-.757161C3.865504-.308842 3.755915-.308842 3.088418-.308842V0C3.437111-.009963 3.945205-.029888 4.214197-.029888C4.473225-.029888 4.991283-.009963 5.330012 0V-.308842C4.662516-.308842 4.552927-.308842 4.552927-.757161V-2.590286C4.552927-3.626401 5.260274-4.184309 5.897883-4.184309C6.525529-4.184309 6.635118-3.646326 6.635118-3.078456V-.757161C6.635118-.308842 6.525529-.308842 5.858032-.308842V0C6.206725-.009963 6.714819-.029888 6.983811-.029888C7.242839-.029888 7.760897-.009963 8.099626 0V-.308842C7.581569-.308842 7.332503-.308842 7.32254-.607721V-2.510585C7.32254-3.367372 7.32254-3.676214 7.013699-4.034869C6.874222-4.204234 6.545455-4.403487 5.967621-4.403487C5.13076-4.403487 4.692403-3.805729 4.523039-3.427148C4.383562-4.293898 3.646326-4.403487 3.198007-4.403487C2.470735-4.403487 2.002491-3.975093 1.723537-3.35741V-4.403487L.318804-4.293898V-3.985056C1.016189-3.985056 1.09589-3.915318 1.09589-3.427148Z'/>\n\x3Cpath id='g2-110' d='M1.09589-3.427148V-.757161C1.09589-.308842 .986301-.308842 .318804-.308842V0C.667497-.009963 1.175592-.029888 1.444583-.029888C1.703611-.029888 2.221669-.009963 2.560399 0V-.308842C1.892902-.308842 1.783313-.308842 1.783313-.757161V-2.590286C1.783313-3.626401 2.49066-4.184309 3.128269-4.184309C3.755915-4.184309 3.865504-3.646326 3.865504-3.078456V-.757161C3.865504-.308842 3.755915-.308842 3.088418-.308842V0C3.437111-.009963 3.945205-.029888 4.214197-.029888C4.473225-.029888 4.991283-.009963 5.330012 0V-.308842C4.811955-.308842 4.562889-.308842 4.552927-.607721V-2.510585C4.552927-3.367372 4.552927-3.676214 4.244085-4.034869C4.104608-4.204234 3.775841-4.403487 3.198007-4.403487C2.470735-4.403487 2.002491-3.975093 1.723537-3.35741V-4.403487L.318804-4.293898V-3.985056C1.016189-3.985056 1.09589-3.915318 1.09589-3.427148Z'/>\n\x3Cpath id='g2-111' d='M4.692403-2.132005C4.692403-3.407223 3.696139-4.463263 2.49066-4.463263C1.24533-4.463263 .278954-3.377335 .278954-2.132005C.278954-.846824 1.315068 .109589 2.480697 .109589C3.686177 .109589 4.692403-.86675 4.692403-2.132005ZM2.49066-.139477C2.062267-.139477 1.62391-.348692 1.354919-.806974C1.105853-1.24533 1.105853-1.853051 1.105853-2.211706C1.105853-2.600249 1.105853-3.138232 1.344956-3.576588C1.613948-4.034869 2.082192-4.244085 2.480697-4.244085C2.919054-4.244085 3.347447-4.024907 3.606476-3.596513S3.865504-2.590286 3.865504-2.211706C3.865504-1.853051 3.865504-1.315068 3.646326-.876712C3.427148-.428394 2.988792-.139477 2.49066-.139477Z'/>\n\x3Cpath id='g2-114' d='M1.663761-3.307597V-4.403487L.278954-4.293898V-3.985056C.976339-3.985056 1.05604-3.915318 1.05604-3.427148V-.757161C1.05604-.308842 .946451-.308842 .278954-.308842V0C.667497-.009963 1.135741-.029888 1.414695-.029888C1.8132-.029888 2.281445-.029888 2.67995 0V-.308842H2.470735C1.733499-.308842 1.713574-.418431 1.713574-.777086V-2.311333C1.713574-3.297634 2.132005-4.184309 2.889166-4.184309C2.958904-4.184309 2.978829-4.184309 2.998755-4.174346C2.968867-4.164384 2.769614-4.044832 2.769614-3.785803C2.769614-3.506849 2.978829-3.35741 3.198007-3.35741C3.377335-3.35741 3.626401-3.476961 3.626401-3.795766S3.317559-4.403487 2.889166-4.403487C2.161893-4.403487 1.803238-3.73599 1.663761-3.307597Z'/>\n\x3Cpath id='g2-116' d='M1.723537-3.985056H3.148194V-4.293898H1.723537V-6.127024H1.474471C1.464508-5.310087 1.165629-4.244085 .18929-4.204234V-3.985056H1.036115V-1.235367C1.036115-.009963 1.96264 .109589 2.321295 .109589C3.028643 .109589 3.307597-.597758 3.307597-1.235367V-1.803238H3.058531V-1.255293C3.058531-.518057 2.759651-.139477 2.391034-.139477C1.723537-.139477 1.723537-1.046077 1.723537-1.215442V-3.985056Z'/>\n\x3Cpath id='g2-117' d='M3.895392-.787049V.109589L5.330012 0V-.308842C4.632628-.308842 4.552927-.37858 4.552927-.86675V-4.403487L3.088418-4.293898V-3.985056C3.785803-3.985056 3.865504-3.915318 3.865504-3.427148V-1.653798C3.865504-.787049 3.387298-.109589 2.660025-.109589C1.823163-.109589 1.783313-.577833 1.783313-1.09589V-4.403487L.318804-4.293898V-3.985056C1.09589-3.985056 1.09589-3.955168 1.09589-3.068493V-1.574097C1.09589-.797011 1.09589 .109589 2.610212 .109589C3.16812 .109589 3.606476-.169365 3.895392-.787049Z'/>\n\x3Cpath id='g3-48' d='M3.598506-2.224658C3.598506-2.991781 3.507846-3.542715 3.187049-4.030884C2.970859-4.351681 2.538481-4.630635 1.980573-4.630635C.36264-4.630635 .36264-2.726775 .36264-2.224658S.36264 .139477 1.980573 .139477S3.598506-1.72254 3.598506-2.224658ZM1.980573-.055791C1.659776-.055791 1.234371-.244085 1.094894-.81594C.99726-1.227397 .99726-1.799253 .99726-2.315318C.99726-2.824408 .99726-3.354421 1.101868-3.737983C1.248319-4.288917 1.694645-4.435367 1.980573-4.435367C2.357161-4.435367 2.719801-4.20523 2.84533-3.800747C2.956912-3.424159 2.963885-2.922042 2.963885-2.315318C2.963885-1.799253 2.963885-1.283188 2.873225-.843836C2.733748-.209215 2.259527-.055791 1.980573-.055791Z'/>\n\x3Cpath id='g3-49' d='M2.336239-4.435367C2.336239-4.623661 2.322291-4.630635 2.127024-4.630635C1.680697-4.191283 1.046077-4.184309 .760149-4.184309V-3.93325C.927522-3.93325 1.387796-3.93325 1.771357-4.128518V-.571856C1.771357-.341719 1.771357-.251059 1.073973-.251059H.808966V0C.934496-.006974 1.792279-.027895 2.050311-.027895C2.266501-.027895 3.145205-.006974 3.29863 0V-.251059H3.033624C2.336239-.251059 2.336239-.341719 2.336239-.571856V-4.435367Z'/>\n\x3Cpath id='g1-83' d='M6.425903-6.924035C6.425903-6.953923 6.405978-7.023661 6.316314-7.023661C6.266501-7.023661 6.256538-7.013699 6.136986-6.874222L5.65878-6.306351C5.399751-6.774595 4.881694-7.023661 4.234122-7.023661C2.968867-7.023661 1.77335-5.877958 1.77335-4.672478C1.77335-3.865504 2.30137-3.407223 2.809465-3.257783L3.875467-2.978829C4.244085-2.889166 4.79203-2.739726 4.79203-1.92279C4.79203-1.026152 3.975093-.089664 2.998755-.089664C2.361146-.089664 1.255293-.308842 1.255293-1.544209C1.255293-1.783313 1.305106-2.022416 1.315068-2.082192C1.325031-2.122042 1.334994-2.132005 1.334994-2.15193C1.334994-2.251557 1.265255-2.261519 1.215442-2.261519S1.145704-2.251557 1.115816-2.221669C1.075965-2.181818 .518057 .089664 .518057 .119552C.518057 .179328 .56787 .219178 .627646 .219178C.67746 .219178 .687422 .209215 .806974 .069738L1.295143-.498132C1.723537 .079701 2.400996 .219178 2.978829 .219178C4.333748 .219178 5.50934-1.105853 5.50934-2.34122C5.50934-3.028643 5.17061-3.367372 5.021171-3.506849C4.79203-3.73599 4.64259-3.775841 3.755915-4.004981C3.536737-4.064757 3.178082-4.164384 3.088418-4.184309C2.819427-4.273973 2.480697-4.562889 2.480697-5.090909C2.480697-5.897883 3.277709-6.744707 4.224159-6.744707C5.051059-6.744707 5.65878-6.316314 5.65878-5.200498C5.65878-4.881694 5.618929-4.702366 5.618929-4.64259C5.618929-4.632628 5.618929-4.542964 5.738481-4.542964C5.838107-4.542964 5.84807-4.572852 5.88792-4.742217L6.425903-6.924035Z'/>\n\x3Cpath id='g0-83' d='M1.857036-3.323537C1.346949-3.443088 .972354-3.849564 .972354-4.335741C.972354-4.869738 1.43462-5.371856 2.12802-5.371856C3.506849-5.371856 3.690162-4.080697 3.730012-3.777833C3.745953-3.690162 3.753923-3.634371 3.857534-3.634371C3.985056-3.634371 3.985056-3.690162 3.985056-3.841594V-5.403736C3.985056-5.531258 3.985056-5.610959 3.881445-5.610959C3.817684-5.610959 3.801743-5.587049 3.745953-5.499377L3.466999-5.053051C3.068493-5.491407 2.558406-5.610959 2.12005-5.610959C1.171606-5.610959 .470237-4.893649 .470237-4.080697C.470237-3.474969 .812951-3.140224 .964384-2.988792C1.251308-2.701868 1.514321-2.638107 2.375093-2.438854C3.060523-2.279452 3.180075-2.255542 3.443088-1.976588C3.52279-1.888917 3.722042-1.617933 3.722042-1.227397C3.722042-.67746 3.299626-.095641 2.550436-.095641C1.673724-.095641 .765131-.518057 .71731-1.625903C.70934-1.753425 .70934-1.809215 .597758-1.809215C.470237-1.809215 .470237-1.745455 .470237-1.594022V-.039851C.470237 .087671 .470237 .167372 .573848 .167372C.637609 .167372 .645579 .151432 .70137 .071731C.73325 .02391 .765131-.047821 .988294-.382565C1.490411 .063761 2.080199 .167372 2.558406 .167372C3.55467 .167372 4.224159-.621669 4.224159-1.474471C4.224159-2.16787 3.769863-2.87721 2.956912-3.068493L1.857036-3.323537Z'/>\n\x3Cpath id='g0-97' d='M3.347447-2.375093C3.347447-3.156164 2.590286-3.55467 1.865006-3.55467C1.203487-3.55467 .613699-3.299626 .613699-2.773599C.613699-2.534496 .781071-2.391034 .988294-2.391034C1.211457-2.391034 1.362889-2.550436 1.362889-2.765629C1.362889-2.956912 1.243337-3.092403 1.067995-3.132254C1.362889-3.331507 1.793275-3.331507 1.849066-3.331507C2.295392-3.331507 2.741719-3.020672 2.741719-2.367123V-2.12005C2.279452-2.096139 1.745455-2.072229 1.187547-1.841096C.486177-1.538232 .350685-1.075965 .350685-.812951C.350685-.127522 1.155666 .079701 1.705604 .079701C2.287422 .079701 2.646077-.247073 2.82142-.565878C2.86127-.263014 3.068493 .039851 3.419178 .039851C3.498879 .039851 4.176339 .00797 4.176339-.71731V-1.155666H3.929265V-.71731C3.929265-.390535 3.809714-.263014 3.642341-.263014C3.347447-.263014 3.347447-.629639 3.347447-.71731V-2.375093ZM2.741719-1.123786C2.741719-.350685 2.088169-.143462 1.769365-.143462C1.354919-.143462 1.004234-.422416 1.004234-.804981C1.004234-1.331009 1.498381-1.872976 2.741719-1.912827V-1.123786Z'/>\n\x3Cpath id='g0-114' d='M1.466501-1.817186C1.466501-2.414944 1.713574-3.275716 2.478705-3.291656C2.430884-3.259776 2.351183-3.196015 2.351183-3.012702C2.351183-2.765629 2.542466-2.654047 2.701868-2.654047C2.893151-2.654047 3.060523-2.781569 3.060523-3.012702C3.060523-3.291656 2.805479-3.514819 2.454795-3.514819C1.936737-3.514819 1.586052-3.124284 1.41868-2.677958H1.41071V-3.514819L.278954-3.427148V-3.164134C.820922-3.164134 .884682-3.108344 .884682-2.717808V-.621669C.884682-.263014 .789041-.263014 .278954-.263014V0C.589788-.02391 1.028144-.02391 1.219427-.02391C1.689664-.02391 1.705604-.02391 2.223661 0V-.263014H2.064259C1.482441-.263014 1.466501-.350685 1.466501-.637609V-1.817186Z'/>\n\x3Cpath id='g0-116' d='M1.482441-3.172105H2.669988V-3.435118H1.482441V-4.901619H1.235367C1.227397-4.176339 .900623-3.419178 .159402-3.395268V-3.172105H.876712V-.996264C.876712-.063761 1.594022 .079701 1.960648 .079701C2.494645 .079701 2.81345-.398506 2.81345-.996264V-1.44259H2.566376V-1.012204C2.566376-.462267 2.319303-.167372 2.016438-.167372C1.482441-.167372 1.482441-.852802 1.482441-.980324V-3.172105Z'/>\n\x3C/defs>\n\x3Cg id='page1'>\n\x3Cg transform='translate(99.0189 67.517)scale(.996264)'>\n\x3Cpath d='M 30.3492 13.7099L 10.5492 13.7099' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='0.8'/>\n\x3C/g>\n\x3Cg transform='translate(99.0189 67.517)scale(.996264)'>\n\x3Cpath d='M 30.3492 13.3099C 28.8492 12.2099 28.1892 10.5499 28.1892 10.3899C 28.1892 10.2099 28.3492 10.1499 28.4892 10.1499C 28.7092 10.1499 28.7492 10.2499 28.8092 10.3499C 29.1092 11.0299 29.7492 12.4899 31.7492 13.4299C 31.9892 13.5499 32.0292 13.5699 32.0292 13.7099C 32.0292 13.8499 31.9892 13.8699 31.7492 13.9899C 29.7492 14.9299 29.1092 16.3899 28.8092 17.0699C 28.7492 17.1699 28.7092 17.2699 28.4892 17.2699C 28.3492 17.2699 28.1892 17.2099 28.1892 17.0299C 28.1892 16.8699 28.8492 15.2099 30.3492 14.1099L 30.3492 13.3099Z' fill='#000000'/>\n\x3C/g>\n\x3Cuse x='100.119775' y='78.634016' xlink:href='#g0-83'/>\n\x3Cuse x='104.824422' y='78.634016' xlink:href='#g0-116'/>\n\x3Cuse x='108.117676' y='78.634016' xlink:href='#g0-97'/>\n\x3Cuse x='112.351859' y='78.634016' xlink:href='#g0-114'/>\n\x3Cuse x='115.652029' y='78.634016' xlink:href='#g0-116'/>\n\x3Cg transform='translate(99.0189 67.517)scale(.996264)'>\n\x3Cpath d='M 53.5093 13.7099C 53.5093 7.77836 48.7008 2.96988 42.7693 2.96988C 36.8377 2.96988 32.0292 7.77836 32.0292 13.7099C 32.0292 19.6415 36.8377 24.4499 42.7693 24.4499C 48.7008 24.4499 53.5093 19.6415 53.5093 13.7099Z' fill='#ffffff'/>\n\x3C/g>\n\x3Cg transform='translate(99.0189 67.517)scale(.996264)'>\n\x3Cpath d='M 53.5093 13.7099C 53.5093 7.77836 48.7008 2.96988 42.7693 2.96988C 36.8377 2.96988 32.0292 7.77836 32.0292 13.7099C 32.0292 19.6415 36.8377 24.4499 42.7693 24.4499C 48.7008 24.4499 53.5093 19.6415 53.5093 13.7099Z' fill='none' stroke='#000040' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1'/>\n\x3C/g>\n\x3Cg fill='#000040'>\n\x3Cuse x='136.343038' y='83.772386' xlink:href='#g1-83'/>\n\x3Cuse x='142.452083' y='85.266767' xlink:href='#g3-48'/>\n\x3C/g>\n\x3Cg transform='translate(99.0189 67.517)scale(.996264)'>\n\x3Cpath d='M 139.43 13.7099C 139.43 7.77836 134.621 2.96988 128.69 2.96988C 122.758 2.96988 117.949 7.77836 117.949 13.7099C 117.949 19.6415 122.758 24.4499 128.69 24.4499C 134.621 24.4499 139.43 19.6415 139.43 13.7099Z' fill='#ffffff'/>\n\x3C/g>\n\x3Cg transform='translate(99.0189 67.517)scale(.996264)'>\n\x3Cpath d='M 139.43 13.7099C 139.43 7.77836 134.621 2.96988 128.69 2.96988C 122.758 2.96988 117.949 7.77836 117.949 13.7099C 117.949 19.6415 122.758 24.4499 128.69 24.4499C 134.621 24.4499 139.43 19.6415 139.43 13.7099Z' fill='none' stroke='#000040' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1'/>\n\x3C/g>\n\x3Cg transform='translate(99.0189 67.517)scale(.996264)'>\n\x3Cpath d='M 137.711 13.7099C 137.711 8.72741 133.672 4.68829 128.69 4.68829C 123.707 4.68829 119.668 8.72741 119.668 13.7099C 119.668 18.6924 123.707 22.7315 128.69 22.7315C 133.672 22.7315 137.711 18.6924 137.711 13.7099Z' fill='none' stroke='#000040' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1'/>\n\x3C/g>\n\x3Cg fill='#000040'>\n\x3Cuse x='221.942298' y='83.772386' xlink:href='#g1-83'/>\n\x3Cuse x='228.051344' y='85.266767' xlink:href='#g3-49'/>\n\x3C/g>\n\x3Cg transform='translate(99.0189 67.517)scale(.996264)'>\n\x3Cpath d='M 116.269 13.7099L 53.5093 13.7099' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='0.8'/>\n\x3C/g>\n\x3Cg transform='translate(99.0189 67.517)scale(.996264)'>\n\x3Cpath d='M 116.269 13.3099C 114.769 12.2099 114.109 10.5499 114.109 10.3899C 114.109 10.2099 114.269 10.1499 114.409 10.1499C 114.629 10.1499 114.669 10.2499 114.729 10.3499C 115.029 11.0299 115.669 12.4899 117.669 13.4299C 117.909 13.5499 117.949 13.5699 117.949 13.7099C 117.949 13.8499 117.909 13.8699 117.669 13.9899C 115.669 14.9299 115.029 16.3899 114.729 17.0699C 114.669 17.1699 114.629 17.2699 114.409 17.2699C 114.269 17.2699 114.109 17.2099 114.109 17.0299C 114.109 16.8699 114.769 15.2099 116.269 14.1099L 116.269 13.3099Z' fill='#000000'/>\n\x3C/g>\n\x3Cg fill='#004000'>\n\x3Cuse x='172.794936' y='78.076096' xlink:href='#g2-108'/>\n\x3Cuse x='175.562344' y='78.076096' xlink:href='#g2-101'/>\n\x3Cuse x='179.990196' y='78.076096' xlink:href='#g2-116'/>\n\x3Cuse x='183.86457' y='78.076096' xlink:href='#g2-116'/>\n\x3Cuse x='187.738944' y='78.076096' xlink:href='#g2-101'/>\n\x3Cuse x='192.166795' y='78.076096' xlink:href='#g2-114'/>\n\x3C/g>\n\x3Cg transform='translate(99.0189 67.517)scale(.996264)'>\n\x3Cpath d='M 137.678 22.2413C 171.643 44.2292 171.179 -18.1822 136.284 6.11556' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='0.8'/>\n\x3C/g>\n\x3Cg transform='translate(99.0189 67.517)scale(.996264)'>\n\x3Cpath d='M 137.455 22.5732C 138.086 24.323 137.708 26.0689 137.619 26.2016C 137.518 26.351 137.352 26.3115 137.236 26.2334C 137.053 26.1107 137.076 26.0054 137.082 25.8889C 137.212 25.1572 137.496 23.5885 136.36 21.6926C 136.228 21.4591 136.206 21.4202 136.284 21.304C 136.362 21.1878 136.406 21.1935 136.673 21.2278C 138.857 21.5635 140.202 20.7089 140.831 20.312C 140.936 20.2624 141.025 20.2018 141.208 20.3245C 141.324 20.4026 141.423 20.5417 141.323 20.6911C 141.234 20.8238 139.76 21.8333 137.901 21.9093L 137.455 22.5732Z' fill='#000000'/>\n\x3C/g>\n\x3Cg fill='#004000'>\n\x3Cuse x='275.210651' y='83.606291' xlink:href='#g2-108'/>\n\x3Cuse x='277.97806' y='83.606291' xlink:href='#g2-101'/>\n\x3Cuse x='282.405911' y='83.606291' xlink:href='#g2-116'/>\n\x3Cuse x='286.280285' y='83.606291' xlink:href='#g2-116'/>\n\x3Cuse x='290.154659' y='83.606291' xlink:href='#g2-101'/>\n\x3Cuse x='294.58251' y='83.606291' xlink:href='#g2-114'/>\n\x3Cuse x='298.484561' y='83.606291' xlink:href='#g2-44'/>\n\x3Cuse x='304.572844' y='83.606291' xlink:href='#g2-100'/>\n\x3Cuse x='310.107661' y='83.606291' xlink:href='#g2-105'/>\n\x3Cuse x='312.87507' y='83.606291' xlink:href='#g2-103'/>\n\x3Cuse x='317.856409' y='83.606291' xlink:href='#g2-105'/>\n\x3Cuse x='320.623817' y='83.606291' xlink:href='#g2-116'/>\n\x3C/g>\n\x3Cg fill='#400000'>\n\x3Cuse x='109.199936' y='116.674607' xlink:href='#g2-70'/>\n\x3Cuse x='115.703354' y='116.674607' xlink:href='#g2-105'/>\n\x3Cuse x='118.470762' y='116.674607' xlink:href='#g2-110'/>\n\x3Cuse x='124.005579' y='116.674607' xlink:href='#g2-105'/>\n\x3Cuse x='126.772988' y='116.674607' xlink:href='#g2-116'/>\n\x3Cuse x='130.647361' y='116.674607' xlink:href='#g2-101'/>\n\x3Cuse x='138.396088' y='116.674607' xlink:href='#g2-65'/>\n\x3Cuse x='145.868087' y='116.674607' xlink:href='#g2-117'/>\n\x3Cuse x='151.402904' y='116.674607' xlink:href='#g2-116'/>\n\x3Cuse x='155.277278' y='116.674607' xlink:href='#g2-111'/>\n\x3Cuse x='160.258617' y='116.674607' xlink:href='#g2-109'/>\n\x3Cuse x='168.560842' y='116.674607' xlink:href='#g2-97'/>\n\x3Cuse x='173.542181' y='116.674607' xlink:href='#g2-116'/>\n\x3Cuse x='177.416555' y='116.674607' xlink:href='#g2-111'/>\n\x3Cuse x='182.397894' y='116.674607' xlink:href='#g2-110'/>\n\x3Cuse x='191.253586' y='116.674607' xlink:href='#g2-102'/>\n\x3Cuse x='194.297743' y='116.674607' xlink:href='#g2-111'/>\n\x3Cuse x='199.279082' y='116.674607' xlink:href='#g2-114'/>\n\x3Cuse x='206.502008' y='116.674607' xlink:href='#g2-97'/>\n\x3Cuse x='211.483347' y='116.674607' xlink:href='#g2-110'/>\n\x3Cuse x='220.339039' y='116.674607' xlink:href='#g2-73'/>\n\x3Cuse x='223.936664' y='116.674607' xlink:href='#g2-100'/>\n\x3Cuse x='229.471481' y='116.674607' xlink:href='#g2-101'/>\n\x3Cuse x='233.899332' y='116.674607' xlink:href='#g2-110'/>\n\x3Cuse x='239.157401' y='116.674607' xlink:href='#g2-116'/>\n\x3Cuse x='243.031775' y='116.674607' xlink:href='#g2-105'/>\n\x3Cuse x='245.799183' y='116.674607' xlink:href='#g2-12'/>\n\x3Cuse x='251.334' y='116.674607' xlink:href='#g2-101'/>\n\x3Cuse x='255.761852' y='116.674607' xlink:href='#g2-114'/>\n\x3C/g>\n\x3C/g>\n\x3C/svg>",type:"svgGraphic"},uuid:"1|21"},$R[434]={content:$R[435]={type:"text",text:"In this diagram, the machine starts in state $S_0$. If it reads a letter, it moves to the accepting state $S_1$. As long as it continues to read letters or digits, it stays in state $S_1$. If it's in state $S_1$ and reads any other character (like a space or a `+` sign), it stops and reports that it has successfully found an identifier."},uuid:"1|22"},$R[436]={content:$R[437]={type:"header",text:"Tools of the Trade"},uuid:"1|23"},$R[438]={content:$R[439]={type:"text",text:"Writing a lexical analyzer from scratch is possible, but it's also a solved problem. Developers often use lexical analyzer generators to do the heavy lifting. The most well-known of these is Lex, and its modern open-source version, Flex."},uuid:"1|24"},$R[440]={content:$R[441]={type:"text",text:"With a tool like Lex, you don't write the state machine yourself. Instead, you provide a file with a list of regular expressions and the corresponding code to execute when each pattern is matched. Lex takes this file and generates C code for a highly optimized scanner."},uuid:"1|25"},$R[442]={content:$R[443]={type:"blockquoteWithCitation",text:"Tokenization: Breaking down text into tokens (words, subwords, or characters).",assetId:3101273},uuid:"1|26"},$R[444]={content:$R[445]={type:"text",text:"Here's a tiny piece of what a Lex file might look like:"},uuid:"1|27"},$R[446]={content:$R[447]={type:"code",markdown:"```\n%{ \n// C code can go here\n%}\n\nDIGIT [0-9]\nLETTER [a-zA-Z]\n\n%%\n\n{LETTER}({LETTER}|{DIGIT})* { printf(\"Found an identifier\\n\"); }\n{DIGIT}+ { printf(\"Found a number\\n\"); }\n[ \\t\\n]+ { /* ignore whitespace */ }\n. { printf(\"Found an unknown character\\n\"); }\n\n%%\n```"},uuid:"1|28"},$R[448]={content:$R[449]={type:"text",text:"This defines patterns for identifiers and numbers. When the generated scanner finds a sequence of characters matching one of these patterns, it runs the associated C code. This simple approach automates the creation of the fast, efficient first pass of a compiler."},uuid:"1|29"},$R[450]={content:$R[451]={type:"quiz",questions:$R[452]=[$R[453]={text:"What is the primary purpose of the lexical analysis phase in a compiler?",options:$R[454]=[$R[455]={text:"To generate machine code from the source code.",followup:"Incorrect. Code generation is one of the final phases of compilation, happening long after the source code has been tokenized and parsed.",isRightAnswer:!1},$R[456]={text:"To check if the code follows the grammatical rules of the language.",followup:"Incorrect. Checking the grammatical structure is the job of the syntax analyzer (parser), which comes after lexical analysis.",isRightAnswer:!1},$R[457]={text:"To convert the stream of source code characters into a sequence of tokens.",followup:"Correct! The lexical analyzer, or scanner, reads the raw source code and groups characters into meaningful units called tokens.",isRightAnswer:!0},$R[458]={text:"To optimize the code for better performance.",followup:"Incorrect. Optimization is a separate phase that aims to improve the efficiency of the code, which occurs after the initial analysis phases.",isRightAnswer:!1}]},$R[459]={text:"In the line of code `int score = 10;`, the character sequence `score` is a ______, which is categorized as a(n) ______ token.",options:$R[460]=[$R[461]={text:"lexeme, keyword",followup:"Incorrect. While `score` is a lexeme, it is a user-defined identifier, not a reserved keyword of the language like `int`.",isRightAnswer:!1},$R[462]={text:"token, identifier",followup:"Incorrect. The term for the actual character sequence in the source code is 'lexeme'.",isRightAnswer:!1},$R[463]={text:"pattern, variable",followup:"Incorrect. A pattern (like a regular expression) is the rule used to recognize a lexeme, not the lexeme itself.",isRightAnswer:!1},$R[464]={text:"lexeme, identifier",followup:"Correct. A lexeme is the actual sequence of characters in the code (`score`), while a token is its classification (`identifier`).",isRightAnswer:!0}]},$R[465]={text:"True or False: In lexical analysis, regular expressions are used to formally describe the patterns for different types of tokens.",options:$R[466]=[$R[467]={text:"True",followup:"Correct. Regular expressions provide a powerful and standard way to define the structure of tokens, such as identifiers, numbers, and operators.",isRightAnswer:!0},$R[468]={text:"False",followup:"Incorrect. Regular expressions are the fundamental tool for specifying the patterns that the lexical analyzer looks for in the source code.",isRightAnswer:!1}]},$R[469]={text:"A lexical analyzer generator like Lex or Flex takes a set of ______ as input and generates code for a ______ as output.",options:$R[470]=[$R[471]={text:"finite automata, regular expressions",followup:"Incorrect. The process is the other way around; regular expressions are used to generate the finite automaton.",isRightAnswer:!1},$R[472]={text:"source code files, executable program",followup:"Incorrect. This describes the function of a full compiler, not a lexical analyzer generator.",isRightAnswer:!1},$R[473]={text:"grammar rules, parser",followup:"Incorrect. Tools that take grammar rules to produce a parser are called parser generators (e.g., Yacc, Bison).",isRightAnswer:!1},$R[474]={text:"regular expressions, finite automaton (scanner)",followup:"Correct. These tools automate the process of converting token pattern definitions (regular expressions) into a highly efficient scanner.",isRightAnswer:!0}]},$R[475]={text:"The abstract machine model often used to implement the pattern-matching logic of a lexical analyzer is called a:",options:$R[476]=[$R[477]={text:"Central Processing Unit (CPU)",followup:"Incorrect. A CPU is the physical hardware that executes instructions, not the abstract model for pattern recognition.",isRightAnswer:!1},$R[478]={text:"Turing Machine",followup:"Incorrect. A Turing Machine is a more powerful model of computation, capable of recognizing a wider class of languages than is necessary for lexical analysis.",isRightAnswer:!1},$R[479]={text:"Finite Automaton",followup:"Correct. A finite automaton (or finite state machine) is the ideal model for recognizing the patterns defined by regular expressions, making it perfect for scanners.",isRightAnswer:!0},$R[480]={text:"Pushdown Automaton",followup:"Incorrect. A pushdown automaton uses a stack and is typically used for syntax analysis (parsing), not lexical analysis.",isRightAnswer:!1}]}]},uuid:"1|30"}]},$R[481]={uuid:"2",title:"Syntax and Semantic Analysis",includesKnowledgeBase:!1,hasDemonstratedMastery:!1,streaming:!1,blocks:$R[482]=[$R[483]={content:$R[484]={type:"header",text:"Checking the Blueprint"},uuid:"2|0"},$R[485]={content:$R[486]={type:"text",text:"After lexical analysis breaks down your code into a stream of tokens, the compiler's next job is to make sure these tokens are arranged in a valid order. This phase is called **syntax analysis**, or more commonly, **parsing**.\n\nThink of the lexical analyzer as a worker checking the quality of individual bricks. The syntax analyzer is the architect who checks if those bricks have been assembled according to the building's blueprint. It doesn't care if a brick is red or blue, only that it's in the right place, forming a valid wall, room, and eventually, a complete house. The parser's job is to verify the grammatical structure of your code."},uuid:"2|1"},$R[487]={content:$R[488]={type:"header",text:"The Rules of the Language"},uuid:"2|2"},$R[489]={content:$R[490]={type:"text",text:"Every programming language has a precise set of rules that define its structure. These rules are formally described using a **Context-Free Grammar (CFG)**. A CFG is a collection of production rules that specify how to form valid sequences of tokens.\n\nFor example, a grammar for simple arithmetic expressions might define that an expression can be a term, or two expressions added together. A term, in turn, could be a factor, or two terms multiplied. This hierarchy of rules allows the compiler to understand complex statements."},uuid:"2|3"},$R[491]={content:$R[492]={type:"code",markdown:"```\nE -> E + T | T // An expression (E) can be an expression plus a term, or just a term\nT -> T * F | F // A term (T) can be a term times a factor, or just a factor\nF -> ( E ) | id // A factor (F) can be an expression in parentheses, or an identifier (id)\n```"},uuid:"2|4"},$R[493]={content:$R[494]={type:"text",text:"If the parser can successfully apply these rules to the token stream, it creates a data structure called a **parse tree** (or syntax tree). This tree represents the grammatical structure of the code, showing how the individual tokens group together into larger constructs, like expressions, statements, and functions."},uuid:"2|5"},$R[495]={content:$R[496]={type:"realImage",url:"https://oboe-storage.s3.amazonaws.com/dev/imagesReal/v1/course-29321/45cab37c-fc97-4681-ad3b-29e2175c781c.png",attributionUrl:"https://commons.wikimedia.org/wiki/File:Grammar_example1_IPL.png",caption:"Parse trees for simple mathematical expressions, showing their hierarchical structure."},uuid:"2|6"},$R[497]={content:$R[498]={type:"header",text:"How Parsers Work"},uuid:"2|7"},$R[499]={content:$R[500]={type:"text",text:"Parsers build the parse tree using different strategies. The two main approaches are top-down and bottom-up parsing.\n\nA **top-down parser** starts with the highest-level rule (like `program` or `function`) and tries to expand it to match the input tokens. It’s predictive, guessing which rule to apply next. **LL parsers** are a common type of top-down parser.\n\nA **bottom-up parser** works the other way. It starts with the stream of tokens and tries to group them together, reducing them into higher-level grammar rules until it reaches the single, top-level rule. This is like assembling a puzzle piece by piece. **LR parsers** are the most common type of bottom-up parser."},uuid:"2|8"},$R[501]={content:$R[502]={type:"table",markdown:"| Feature | LL Parsing (Top-Down) | LR Parsing (Bottom-Up) |\n| :--- | :--- | :--- |\n| **Approach** | Starts with the root and expands | Starts with the leaves and reduces |\n| **Grammar Power** | Handles a smaller, more restrictive class of grammars | Handles a much larger and more common class of grammars |\n| **Implementation** | Can be easier to write by hand (e.g., recursive descent) | More complex; usually generated by tools like YACC or Bison |"},uuid:"2|9"},$R[503]={content:$R[504]={type:"header",text:"Does It Make Sense?"},uuid:"2|10"},$R[505]={content:$R[506]={type:"text",text:"Once the parser confirms the code is grammatically correct, the compiler moves to **semantic analysis**. This phase checks if the code is meaningful. Just because a sentence is syntactically valid doesn't mean it makes sense. For example, the English sentence \"The rock flies gracefully\" is grammatically perfect, but semantically questionable.\n\nIn programming, semantic analysis catches errors that the parser can't. It's where the compiler enforces rules that go beyond pure structure."},uuid:"2|11"},$R[507]={content:$R[508]={type:"blockquote",text:"Syntax is about structure. Semantics is about meaning."},uuid:"2|12"},$R[509]={content:$R[510]={type:"text",text:"Two of the most important tasks in semantic analysis are type checking and scope resolution.\n\n**Type checking** ensures that operations are performed on compatible data types. The compiler checks rules like:\n* You can't add a string to an integer (`5 + \"hello\"`).\n* You must pass the correct number and type of arguments to a function.\n* You can't assign a floating-point number to a variable declared as a boolean.\n\n**Scope resolution** is the process of matching identifiers (like variable and function names) to their declarations. The compiler figures out which `x` you're referring to in different parts of the code. This is how it catches errors like using a variable before it has been declared or trying to access a local variable from outside its function."},uuid:"2|13"},$R[511]={content:$R[512]={type:"code",markdown:"```\nvoid myFunction() {\n int x = 10; \n}\n\nvoid anotherFunction() {\n // Semantic Error: 'x' is not defined in this scope.\n // The compiler catches this during semantic analysis.\n print(x); \n}\n```"},uuid:"2|14"},$R[513]={content:$R[514]={type:"text",text:"During this phase, the compiler enriches the parse tree with semantic information, like the data type of each expression. This annotated tree is then passed on to the next phase of compilation."},uuid:"2|15"},$R[515]={content:$R[516]={type:"quiz",questions:$R[517]=[$R[518]={text:"What is the primary role of the syntax analysis (parsing) phase in a compiler?",options:$R[519]=[$R[520]={text:"To check if variables are used with compatible data types.",followup:"This is a key task of semantic analysis, which checks for meaning after the structure has been verified.",isRightAnswer:!1},$R[521]={text:"To break the source code into a stream of individual tokens.",followup:"This describes lexical analysis, which happens before parsing.",isRightAnswer:!1},$R[522]={text:"To convert the program into machine-executable code.",followup:"This is the final phase, code generation, which happens much later.",isRightAnswer:!1},$R[523]={text:"To verify that the stream of tokens conforms to the language's grammatical rules.",followup:"Correct! The parser checks the code's structure against the language's grammar, much like checking a sentence's grammar.",isRightAnswer:!0}]},$R[524]={text:"A parser uses a set of rules to validate the structure of code. What is this formal set of rules called?",options:$R[525]=[$R[526]={text:"A Regular Expression",followup:"Regular expressions are powerful for defining the patterns of individual tokens (like identifiers or numbers) during lexical analysis, not the overall program structure.",isRightAnswer:!1},$R[527]={text:"A Context-Free Grammar (CFG)",followup:"Correct. A Context-Free Grammar provides the production rules that define the valid syntax of a programming language.",isRightAnswer:!0},$R[528]={text:"An Abstract Syntax Tree (AST)",followup:"The AST is the *output* of the parsing phase, representing the code's structure. It's not the set of rules used to create it.",isRightAnswer:!1},$R[529]={text:"A Type System",followup:"A type system defines rules for data types and is checked during semantic analysis, not parsing.",isRightAnswer:!1}]},$R[530]={text:"A parser that starts with the input tokens and tries to group them into higher-level grammatical constructs is known as a(n) ________ parser.",options:$R[531]=[$R[532]={text:"bottom-up",followup:"Correct. A bottom-up parser starts with the tokens (the 'bottom') and reduces them into grammar rules, working its way up to the single top-level rule.",isRightAnswer:!0},$R[533]={text:"top-down",followup:"A top-down parser does the opposite; it starts with the highest-level rule (e.g., 'program') and tries to expand it to match the tokens.",isRightAnswer:!1},$R[534]={text:"predictive",followup:"Predictive parsing is a characteristic of top-down parsers, where the parser must predict which grammar rule to apply next.",isRightAnswer:!1}]},$R[535]={text:"Which of the following errors would be caught during the semantic analysis phase, NOT the parsing phase?",options:$R[536]=[$R[537]={text:"An opening parenthesis `(` without a matching closing parenthesis `)`.",followup:"This is a classic syntax error. The parser is responsible for ensuring that constructs like parentheses are properly balanced.",isRightAnswer:!1},$R[538]={text:"An `else` keyword without a preceding `if`.",followup:"This violates the grammatical rule that an `else` must follow an `if`, so it's a syntax error caught by the parser.",isRightAnswer:!1},$R[539]={text:"A missing semicolon at the end of a statement.",followup:"This is a structural error that violates the language's grammar, so it would be caught by the parser.",isRightAnswer:!1},$R[540]={text:"Calling a function with the wrong number of arguments.",followup:"Correct. The structure `function(arg1, arg2)` is syntactically valid. Semantic analysis checks the *meaning*, including whether the function's definition matches this call.",isRightAnswer:!0}]},$R[541]={text:"The task of matching a variable name to its declaration is called scope resolution.",options:$R[542]=[$R[543]={text:"True",followup:"Correct! Scope resolution is a crucial part of semantic analysis where the compiler determines which declaration an identifier refers to, catching errors like using undeclared variables.",isRightAnswer:!0},$R[544]={text:"False",followup:"This statement is true. Scope resolution is the process of linking identifiers to their declarations.",isRightAnswer:!1}]},$R[545]={text:"After a successful parse, what data structure representing the code's grammatical hierarchy is passed to the next phase of compilation?",options:$R[546]=[$R[547]={text:"A Parse Tree",followup:"Correct! The parse tree (or syntax tree) is a hierarchical data structure that represents how the tokens are grouped together according to the grammar rules.",isRightAnswer:!0},$R[548]={text:"A Token Stream",followup:"The token stream is the *input* to the parser, not its output.",isRightAnswer:!1},$R[549]={text:"A Hash Table",followup:"While a hash table (or symbol table) is used by the compiler to store information about identifiers, it doesn't represent the code's grammatical structure.",isRightAnswer:!1},$R[550]={text:"A Control Flow Graph",followup:"A control flow graph represents the flow of execution in a program and is typically created later in the compilation process.",isRightAnswer:!1}]}]},uuid:"2|16"},$R[551]={content:$R[552]={type:"text",text:"By the end of semantic analysis, the compiler has a deep understanding of the source code. It has confirmed the code is not only structured correctly but is also logically consistent and meaningful according to the language's rules."},uuid:"2|17"}]},$R[553]={uuid:"3",title:"Intermediate Code Generation",includesKnowledgeBase:!1,hasDemonstratedMastery:!1,streaming:!1,blocks:$R[554]=[$R[555]={content:$R[556]={type:"header",text:"The Compiler's Universal Language"},uuid:"3|0"},$R[557]={content:$R[558]={type:"text",text:"After a compiler has checked your code for grammatical errors (syntax analysis) and logical sense (semantic analysis), it doesn't immediately translate it into the zeros and ones a computer understands. Instead, it first translates the code into an intermediate form.\n\nThink of this intermediate code as a universal language. It's more detailed than the high-level language you wrote, but it's not tied to any specific type of computer hardware. It acts as a bridge, connecting the front end of the compiler (which understands your source code) to the back end (which generates machine-specific code)."},uuid:"3|1"},$R[559]={content:$R[560]={type:"blockquote",text:"Using an intermediate representation makes the compiler more flexible. The same front end can be paired with different back ends to create versions of the compiler for different computer architectures."},uuid:"3|2"},$R[561]={content:$R[562]={type:"header",text:"Forms of Intermediate Code"},uuid:"3|3"},$R[563]={content:$R[564]={type:"text",text:"There are several ways to represent this intermediate code. Two of the most common are Abstract Syntax Trees (ASTs) and Three-Address Code.\n\nAn **Abstract Syntax Tree** is a streamlined version of the parse tree created during syntax analysis. It captures the essential structure of the code, stripping away non-essential details like parentheses and semicolons. It’s a hierarchical representation of how the code is organized."},uuid:"3|4"},$R[565]={content:$R[566]={type:"text",text:"Another common form is **Three-Address Code (TAC)**. This representation breaks down complex expressions into a sequence of simple instructions. Each instruction has at most one operator, a result, and two operands (or \"addresses\"). The \"addresses\" can be variable names, constants, or compiler-generated temporary variables.\n\nThis format is helpful because it resembles a simple assembly language, making the final translation to machine code much easier. For example, the expression `x = a + b * c` would be broken down like this:"},uuid:"3|6"},$R[567]={content:$R[568]={type:"code",markdown:"```\nt1 = b * c\nt2 = a + t1\nx = t2\n```"},uuid:"3|7"},$R[569]={content:$R[570]={type:"text",text:"Here, `t1` and `t2` are temporary variables created by the compiler to hold intermediate results. Each line performs a single, simple operation."},uuid:"3|8"},$R[571]={content:$R[572]={type:"header",text:"From Tree to Instructions"},uuid:"3|9"},$R[573]={content:$R[574]={type:"text",text:"How does the compiler convert a parse tree or AST into three-address code? It performs a traversal of the tree, typically a post-order traversal (visiting children before the parent). For each operator node in the tree, it generates a new temporary variable and an instruction to compute the result."},uuid:"3|10"},$R[575]={content:$R[576]={type:"realImage",url:"https://oboe-storage.s3.amazonaws.com/dev/imagesReal/v1/927b31a2-dc2c-484a-8c75-3e04678740a4.png",attributionUrl:"https://commons.wikimedia.org/wiki/File:Syntax_Diagrams.png",caption:"Syntax diagrams, like parse trees, break down language structure. Intermediate code generation translates this structure into a linear sequence of simple instructions."},uuid:"3|11"},$R[577]={content:$R[578]={type:"text",text:"Let's trace this for the `x = a + b * c` AST:\n1. The compiler starts at the root, the `=` operator. It needs to process the children first.\n2. It moves to the right child, the `+` operator. Again, it needs to process its children first.\n3. It moves to the right child of `+`, which is the `*` operator.\n4. It looks at the children of `*`: `b` and `c`. These are leaves, so it can generate code. It creates a temporary variable, `t1`, and generates the instruction `t1 = b * c`.\n5. Now the `*` node is done. The compiler moves back up to the `+` node. It takes the left child, `a`, and the result from the right child, `t1`. It creates a new temporary variable, `t2`, and generates `t2 = a + t1`.\n6. Finally, it moves back to the root `=` node. It takes the left child, `x`, and the result from the right child, `t2`, and generates the final instruction: `x = t2`.\n\nThis methodical process reliably translates the hierarchical tree structure into a flat, sequential list of simple instructions."},uuid:"3|12"},$R[579]={content:$R[580]={type:"blockquote",text:"The key advantage of this intermediate step is separation of concerns. The front end worries about understanding the source language, and the back end worries about the target machine. The intermediate code provides a clean, well-defined interface between them."},uuid:"3|13"},$R[581]={content:$R[582]={type:"quiz",questions:$R[583]=[$R[584]={text:"What is the primary role of intermediate code in the compilation process?",options:$R[585]=[$R[586]={text:"To optimize the code for a specific computer hardware architecture.",followup:"Incorrect. While some optimizations can happen at the intermediate level, architecture-specific optimization is a key function of the compiler's back end.",isRightAnswer:!1},$R[587]={text:"To act as a bridge between the compiler's front end (source analysis) and back end (code generation).",followup:"Correct. Intermediate code is a machine-independent representation that decouples the source language from the target hardware.",isRightAnswer:!0},$R[588]={text:"To check the source code for grammatical errors like missing semicolons.",followup:"Incorrect. This task, known as syntax analysis, happens in the front end before intermediate code is generated.",isRightAnswer:!1},$R[589]={text:"To directly execute the program's instructions on the computer's processor.",followup:"Incorrect. That is the role of machine code, which is generated by the compiler's back end from the intermediate code.",isRightAnswer:!1}]},$R[590]={text:"True or False: An Abstract Syntax Tree (AST) is a streamlined version of a parse tree that omits non-essential details like parentheses.",options:$R[591]=[$R[592]={text:"True",followup:"Correct. An AST captures the essential hierarchical structure of the code without the grammatical clutter found in a full parse tree.",isRightAnswer:!0},$R[593]={text:"False",followup:"Incorrect. An AST is indeed a simplified, or 'abstracted', version of the parse tree.",isRightAnswer:!1}]},$R[594]={text:"A single instruction in Three-Address Code (TAC) has at most one operator, a result, and two ______.",options:$R[595]=[$R[596]={text:"keywords",followup:"Incorrect. Keywords are reserved words in the source language, not components of a TAC instruction.",isRightAnswer:!1},$R[597]={text:"operands",followup:"Correct. The 'three addresses' refer to the two operands and one result (e.g., `result = operand1 + operand2`).",isRightAnswer:!0},$R[598]={text:"functions",followup:"Incorrect. A function call might be broken down into several TAC instructions, but 'functions' are not the general components of a single instruction.",isRightAnswer:!1}]},$R[599]={text:"Which of the following correctly represents the expression `z = x * y + w` in Three-Address Code?",options:$R[600]=[$R[601]={text:"`t1 = y + w; z = x * t1`",followup:"Incorrect. This representation does not respect the standard order of operations (multiplication before addition).",isRightAnswer:!1},$R[602]={text:"`t1 = x * y; t2 = t1 + w; z = t2`",followup:"Incorrect. While this produces the correct result, it uses an unnecessary instruction. The result of the addition can be directly assigned to `z`.",isRightAnswer:!1},$R[603]={text:"`z = x * y + w`",followup:"Incorrect. This is the original expression, not Three-Address Code, which requires each instruction to have at most one operator.",isRightAnswer:!1},$R[604]={text:"`t1 = x * y; z = t1 + w`",followup:"Correct. The multiplication is performed first and stored in a temporary variable, `t1`. Then, the addition is performed using that result.",isRightAnswer:!0}]},$R[605]={text:"What type of tree traversal is typically used to generate Three-Address Code from an Abstract Syntax Tree?",options:$R[606]=[$R[607]={text:"In-order traversal (visiting the left child, then the parent, then the right child).",followup:"Incorrect. While this order seems intuitive for reading expressions, it's not the standard method for generating sequential code.",isRightAnswer:!1},$R[608]={text:"Pre-order traversal (visiting the parent node before its children).",followup:"Incorrect. Pre-order traversal would process an operator before its operands are available.",isRightAnswer:!1},$R[609]={text:"Post-order traversal (visiting child nodes before their parent node).",followup:"Correct. By visiting the children first, the compiler ensures that the values of the operands are computed before it generates the instruction for their parent operator.",isRightAnswer:!0}]}]},uuid:"3|14"},$R[610]={content:$R[611]={type:"text",text:"This intermediate stage is a crucial, if often hidden, part of compilation. It simplifies the complex task of translation and makes it possible to build powerful, portable compilers."},uuid:"3|15"}]},$R[612]={uuid:"4",title:"Code Optimization",includesKnowledgeBase:!1,hasDemonstratedMastery:!1,streaming:!1,blocks:$R[613]=[$R[614]={content:$R[615]={type:"header",text:"Making Code Faster"},uuid:"4|0"},$R[616]={content:$R[617]={type:"text",text:"Once a compiler has checked your code for errors and translated it into an intermediate form, it has a chance to polish it. This step is called code optimization. The goal is simple: make the final program run faster and use less memory. The compiler looks for ways to rewrite the intermediate code into a more efficient version that does the exact same thing."},uuid:"4|1"},$R[618]={content:$R[619]={type:"blockquote",text:"Think of it like editing a rough draft. The story is there, but you can rephrase sentences and cut unnecessary words to make it flow better. The meaning doesn't change, but the final product is much cleaner and easier to read."},uuid:"4|2"},$R[620]={content:$R[621]={type:"text",text:"The compiler acts as a tireless editor, automatically applying proven techniques to improve the code's performance. These improvements can make a noticeable difference, especially in large and complex applications."},uuid:"4|3"},$R[622]={content:$R[623]={type:"header",text:"Common Optimization Tricks"},uuid:"4|4"},$R[624]={content:$R[625]={type:"text",text:"Compilers have a whole toolbox of optimization techniques. Let's look at a few of the most common ones."},uuid:"4|5"},$R[626]={content:$R[627]={type:"definition",term:"Dead Code Elimination",definition:"The process of removing code that is unreachable or whose output is never used. This reduces the size of the final program.",syllables:$R[628]=["ded","kohd","ih-lim-uh-ney-shuhn"],phonetic:"/dɛd koʊd ɪˌlɪmɪˈneɪʃən/",partOfSpeech:"other",exampleUsage:"The compiler used dead code elimination to remove the unused function."},uuid:"4|6"},$R[629]={content:$R[630]={type:"text",text:"Sometimes, code is written that can never actually be executed. For example, a block of code inside an `if` statement that is always false. The compiler can identify and remove this \"dead\" code, making the program smaller and slightly faster because the computer doesn't have to check a useless condition."},uuid:"4|7"},$R[631]={content:$R[632]={type:"code",markdown:"```\n// Before Optimization\n\nvoid greet() {\n bool debugMode = false;\n if (debugMode) {\n // This is dead code\n print(\"Debugging...\");\n }\n print(\"Hello!\");\n}\n\n// After Dead Code Elimination\n\nvoid greet() {\n print(\"Hello!\");\n}\n```"},uuid:"4|8"},$R[633]={content:$R[634]={type:"text",text:"Another simple but effective technique is called constant folding. If your code contains an expression with constant values, like `5 * 10`, the compiler can calculate the result during compilation. It replaces the expression directly with the answer, `50`."},uuid:"4|9"},$R[635]={content:$R[636]={type:"blockquote",text:"This saves the computer from having to do the math every single time the program runs. It's a small change, but these savings add up."},uuid:"4|10"},$R[637]={content:$R[638]={type:"code",markdown:"```\n// Before Optimization\nconst int secondsInMinute = 60;\nconst int minutesInHour = 60;\nint secondsInHour = secondsInMinute * minutesInHour;\n\n// After Constant Folding\nint secondsInHour = 3600;\n```"},uuid:"4|11"},$R[639]={content:$R[640]={type:"text",text:"Finally, there's loop optimization. Programs often spend a lot of time in loops, so making them more efficient can have a big impact. One common strategy is to move any calculation that doesn't change inside the loop to a spot outside the loop. This is called code motion."},uuid:"4|12"},$R[641]={content:$R[642]={type:"code",markdown:"```\n// Before Loop Optimization\n\nfor (int i = 0; i \x3C 100; i++) {\n // This calculation is the same every time\n int limit = x + y;\n if (items[i] > limit) {\n // do something\n }\n}\n\n// After Loop Optimization\n\n// Move the calculation outside the loop\nint limit = x + y;\nfor (int i = 0; i \x3C 100; i++) {\n if (items[i] > limit) {\n // do something\n }\n}\n```"},uuid:"4|13"},$R[643]={content:$R[644]={type:"text",text:"Instead of calculating `x + y` one hundred times, the optimized code calculates it just once. This makes the loop run significantly faster."},uuid:"4|14"},$R[645]={content:$R[646]={type:"header",text:"A Balancing Act"},uuid:"4|15"},$R[647]={content:$R[648]={type:"text",text:"Optimization seems like a clear win, but it involves trade-offs. The main one is time. Applying many complex optimizations can make the compilation process itself take much longer. A programmer might want a quick compilation to test a small change, and a long optimization pass would just slow them down."},uuid:"4|16"},$R[649]={content:$R[650]={type:"realImage",url:"https://oboe-storage.s3.amazonaws.com/dev/imagesReal/v1/3bcfbb6f-f4d8-4c66-8dd4-fc144e763b8f.png",attributionUrl:"https://commons.wikimedia.org/wiki/File:Role_of_Experimentation_Lab_in_Development_and_Evaluation.png",caption:"Optimization is just one step in a larger software development process."},uuid:"4|17"},$R[651]={content:$R[652]={type:"text",text:"For this reason, compilers usually offer different optimization levels. When developing, you might use a low level of optimization for faster compile times. When you're ready to release the final program, you'd switch to a high optimization level to ensure the best possible runtime performance, even if it takes a few extra minutes to compile."},uuid:"4|18"},$R[653]={content:$R[654]={type:"table",markdown:"| Optimization Level | Compile Time | Runtime Performance | Best For |\n|---|---|---|---|\n| **None (Level 0)** | Fastest | Slowest | Quick testing, debugging |\n| **Standard (Level 1)** | Medium | Good | General development |\n| **Aggressive (Level 2/3)** | Slowest | Fastest | Final release versions |"},uuid:"4|19"},$R[655]={content:$R[656]={type:"text",text:"Ultimately, the impact of optimization is a faster, smaller, and more efficient program. By cleaning up the intermediate code, the compiler sets the stage for generating a high-quality final executable."},uuid:"4|20"},$R[657]={content:$R[658]={type:"quiz",questions:$R[659]=[$R[660]={text:"What is the primary goal of the code optimization phase in a compiler?",options:$R[661]=[$R[662]={text:"To check the code for syntax errors.",followup:"Not quite. Error checking happens earlier in the compilation process, before optimization begins.",isRightAnswer:!1},$R[663]={text:"To add comments and documentation to the code automatically.",followup:"That's not the role of a compiler. Optimization is about improving the performance of the executable, not its documentation.",isRightAnswer:!1},$R[664]={text:"To make the final program run faster and use less memory.",followup:"Correct! Optimization aims to rewrite the intermediate code into a more efficient version that improves runtime performance.",isRightAnswer:!0},$R[665]={text:"To translate the source code into a human-readable format.",followup:"Incorrect. The compilation process as a whole translates human-readable code into machine code; optimization specifically focuses on making that code more efficient.",isRightAnswer:!1}]},$R[666]={text:"If a block of code within an `if` statement can never be reached because the condition is always false, a compiler can remove it. What is this optimization technique called?",options:$R[667]=[$R[668]={text:"Code motion",followup:"Incorrect. Code motion involves moving a calculation outside of a loop if it doesn't change within the loop.",isRightAnswer:!1},$R[669]={text:"Syntax simplification",followup:"That's not a standard term for this optimization. The correct term is dead code elimination.",isRightAnswer:!1},$R[670]={text:"Constant folding",followup:"Incorrect. Constant folding is when the compiler computes expressions with constant values, like `2 + 2`, at compile time.",isRightAnswer:!1},$R[671]={text:"Dead code elimination",followup:"That's right! Removing code that can never be executed is called dead code elimination.",isRightAnswer:!0}]},$R[672]={text:"A compiler performing constant folding would transform the code `let area = 5 * 10;` into `let area = 50;`.",options:$R[673]=[$R[674]={text:"True",followup:"Correct! Constant folding involves evaluating expressions with known constant values during compilation, saving the computer from having to do the calculation at runtime.",isRightAnswer:!0},$R[675]={text:"False",followup:"Incorrect. This is a classic example of constant folding. Since the values `5` and `10` are constants, the compiler can compute the result and replace the expression directly.",isRightAnswer:!1}]},$R[676]={text:"What is the main trade-off when enabling higher levels of code optimization?",options:$R[677]=[$R[678]={text:"The code becomes harder for other programmers to read.",followup:"Incorrect. Optimization is performed on an intermediate representation of the code, not the original source code, so it doesn't affect readability.",isRightAnswer:!1},$R[679]={text:"The final program may become larger.",followup:"Not usually. While some optimizations could theoretically increase code size, the goal is typically to make the program smaller and faster.",isRightAnswer:!1},$R[680]={text:"The compilation process takes longer.",followup:"Exactly. More aggressive optimizations require more analysis and work by the compiler, which increases the time it takes to build the program.",isRightAnswer:!0}]},$R[681]={text:"Moving a calculation that doesn't change from inside a loop to before the loop is an example of which optimization technique?",options:$R[682]=[$R[683]={text:"Code motion",followup:"Correct! This specific type of loop optimization is often called loop-invariant code motion.",isRightAnswer:!0},$R[684]={text:"Constant folding",followup:"Incorrect. Constant folding computes expressions like `5 * 10` at compile time.",isRightAnswer:!1},$R[685]={text:"Dead code elimination",followup:"Incorrect. Dead code elimination removes code that is never executed.",isRightAnswer:!1}]}]},uuid:"4|21"}]},$R[686]={uuid:"5",title:"Code Generation",includesKnowledgeBase:!1,hasDemonstratedMastery:!1,streaming:!1,blocks:$R[687]=[$R[688]={content:$R[689]={type:"header",text:"The Final Translation"},uuid:"5|0"},$R[690]={content:$R[691]={type:"text",text:"After all the analysis, checking, and optimizing, we've arrived at the final stage of the compilation process: code generation. This is where the compiler translates the cleaned-up intermediate code into a language the target computer can actually understand and execute. Think of the intermediate code as a perfected, universal recipe. The code generator is the chef who adapts that recipe for a specific kitchen, using the available pots, pans, and burners to create the final meal."},uuid:"5|1"},$R[692]={content:$R[693]={type:"text",text:"The output of this phase is the target code, which is often in assembly language. An assembler, a separate program, then performs the final, simple conversion from assembly into the pure binary machine code that the processor runs."},uuid:"5|2"},$R[694]={content:$R[695]={type:"header",text:"Making Critical Choices"},uuid:"5|3"},$R[696]={content:$R[697]={type:"text",text:"The code generator's job isn't just a direct, one-to-one translation. It has to make intelligent decisions to produce efficient code. Two of the most important decisions are instruction selection and register allocation."},uuid:"5|4"},$R[698]={content:$R[699]={type:"blockquote",text:"Instruction selection is the process of choosing the best machine instructions to implement the operations specified in the intermediate code."},uuid:"5|5"},$R[700]={content:$R[701]={type:"text",text:"Different processors have different instruction sets. A simple intermediate instruction like `ADD a, b` might be translated in several ways. One processor might have a single instruction that can load two values from memory, add them, and store the result. Another might require separate instructions for each step: one to load `a`, another to load `b`, a third to perform the addition, and a fourth to store the outcome. The code generator must know the target CPU's capabilities and select the most efficient sequence of instructions."},uuid:"5|6"},$R[702]={content:$R[703]={type:"realImage",url:"https://oboe-storage.s3.amazonaws.com/dev/imagesReal/v1/e6197f82-bc91-41fc-8fb9-86a413806223.jpeg",attributionUrl:"https://commons.wikimedia.org/wiki/File:Nintendo_cpu-mgb_mcmaster_mz_mit20x.jpg",caption:"The code generator produces instructions tailored to a specific CPU architecture, like this Nintendo microprocessor."},uuid:"5|7"},$R[704]={content:$R[705]={type:"blockquote",text:"Register allocation is the process of deciding which variables to keep in the CPU's limited, high-speed registers and for how long."},uuid:"5|8"},$R[706]={content:$R[707]={type:"text",text:"Accessing data from the computer's main memory (RAM) is slow compared to accessing it from a CPU register. Because there are very few registers available, they are prime real estate. The code generator tries to keep frequently used variables in registers to speed up the program. This involves a complex puzzle: which variable gets a register? If all registers are full, which variable gets moved back to main memory (a process called \"spilling\") to make room? Good register allocation can have a massive impact on a program's execution speed."},uuid:"5|9"},$R[708]={content:$R[709]={svgMarkup:"\x3C?xml version='1.0' encoding='UTF-8'?>\n\x3C!-- This file was generated by dvisvgm 2.11.1 -->\n\x3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='283.464567pt' height='283.464567pt' viewBox='198.141732 305.437883 283.464567 283.464567'>\n\x3Cdefs>\n\x3Cpath id='g0-48' d='M3.897385-2.542466C3.897385-3.395268 3.809714-3.913325 3.5467-4.423412C3.196015-5.124782 2.550436-5.300125 2.11208-5.300125C1.107846-5.300125 .74122-4.550934 .629639-4.327771C.342715-3.745953 .326775-2.956912 .326775-2.542466C.326775-2.016438 .350685-1.211457 .73325-.573848C1.099875 .01594 1.689664 .167372 2.11208 .167372C2.494645 .167372 3.180075 .047821 3.57858-.74122C3.873474-1.315068 3.897385-2.024408 3.897385-2.542466ZM2.11208-.055791C1.841096-.055791 1.291158-.183313 1.123786-1.020174C1.036115-1.474471 1.036115-2.223661 1.036115-2.638107C1.036115-3.188045 1.036115-3.745953 1.123786-4.184309C1.291158-4.99726 1.912827-5.076961 2.11208-5.076961C2.383064-5.076961 2.933001-4.941469 3.092403-4.216189C3.188045-3.777833 3.188045-3.180075 3.188045-2.638107C3.188045-2.16787 3.188045-1.45056 3.092403-1.004234C2.925031-.167372 2.375093-.055791 2.11208-.055791Z'/>\n\x3Cpath id='g0-51' d='M2.016438-2.662017C2.646077-2.662017 3.044583-2.199751 3.044583-1.362889C3.044583-.366625 2.478705-.071731 2.056289-.071731C1.617933-.071731 1.020174-.231133 .74122-.653549C1.028144-.653549 1.227397-.836862 1.227397-1.099875C1.227397-1.354919 1.044085-1.538232 .789041-1.538232C.573848-1.538232 .350685-1.40274 .350685-1.083935C.350685-.326775 1.163636 .167372 2.072229 .167372C3.132254 .167372 3.873474-.565878 3.873474-1.362889C3.873474-2.024408 3.347447-2.630137 2.534496-2.805479C3.164134-3.028643 3.634371-3.57061 3.634371-4.208219S2.917061-5.300125 2.088169-5.300125C1.235367-5.300125 .589788-4.837858 .589788-4.23213C.589788-3.937235 .789041-3.809714 .996264-3.809714C1.243337-3.809714 1.40274-3.985056 1.40274-4.216189C1.40274-4.511083 1.147696-4.622665 .972354-4.630635C1.307098-5.068991 1.920797-5.092902 2.064259-5.092902C2.271482-5.092902 2.87721-5.029141 2.87721-4.208219C2.87721-3.650311 2.646077-3.315567 2.534496-3.188045C2.295392-2.940971 2.11208-2.925031 1.625903-2.893151C1.474471-2.885181 1.41071-2.87721 1.41071-2.773599C1.41071-2.662017 1.482441-2.662017 1.617933-2.662017H2.016438Z'/>\n\x3Cpath id='g0-58' d='M1.617933-2.988792C1.617933-3.259776 1.40274-3.435118 1.179577-3.435118C.908593-3.435118 .73325-3.219925 .73325-2.996762C.73325-2.725778 .948443-2.550436 1.171606-2.550436C1.44259-2.550436 1.617933-2.765629 1.617933-2.988792ZM1.617933-.438356C1.617933-.70934 1.40274-.884682 1.179577-.884682C.908593-.884682 .73325-.669489 .73325-.446326C.73325-.175342 .948443 0 1.171606 0C1.44259 0 1.617933-.215193 1.617933-.438356Z'/>\n\x3Cpath id='g0-65' d='M3.371357-5.515318C3.331507-5.618929 3.307597-5.69066 3.172105-5.69066C3.028643-5.69066 3.004732-5.626899 2.964882-5.515318L1.187547-.820922C1.107846-.605729 .940473-.263014 .286924-.263014V0C.541968-.02391 .964384-.02391 1.107846-.02391C1.362889-.02391 1.601993-.02391 1.992528 0V-.263014C1.641843-.270984 1.43462-.430386 1.43462-.661519C1.43462-.71731 1.43462-.73325 1.474471-.828892L1.849066-1.825156H4.016936L4.463263-.645579C4.503113-.549938 4.503113-.518057 4.503113-.502117C4.503113-.263014 4.088667-.263014 3.865504-.263014V0C4.542964-.02391 4.558904-.02391 4.99726-.02391C5.443587-.02391 5.587049-.02391 6.049315 0V-.263014H5.913823C5.411706-.263014 5.332005-.334745 5.236364-.589788L3.371357-5.515318ZM2.933001-4.694396L3.913325-2.088169H1.944707L2.933001-4.694396Z'/>\n\x3Cpath id='g0-70' d='M4.933499-5.419676H.350685V-5.156663H.526027C1.139726-5.156663 1.155666-5.068991 1.155666-4.774097V-.645579C1.155666-.350685 1.139726-.263014 .526027-.263014H.350685V0C1.028144-.02391 1.044085-.02391 1.578082-.02391C1.952677-.02391 2.534496-.02391 2.893151 0V-.263014H2.638107C1.888917-.263014 1.888917-.374595 1.888917-.653549V-2.582316H2.630137C3.411208-2.582316 3.506849-2.335243 3.506849-1.649813H3.753923V-3.777833H3.506849C3.506849-3.100374 3.411208-2.84533 2.630137-2.84533H1.888917V-4.829888C1.888917-5.100872 1.904857-5.156663 2.271482-5.156663H3.331507C4.630635-5.156663 4.782067-4.654545 4.917559-3.610461H5.164633L4.933499-5.419676Z'/>\n\x3Cpath id='g0-100' d='M2.622167-5.443587V-5.180573C3.164134-5.180573 3.227895-5.124782 3.227895-4.734247V-3.052553C2.948941-3.355417 2.574346-3.514819 2.1599-3.514819C1.163636-3.514819 .278954-2.741719 .278954-1.713574C.278954-.73325 1.075965 .079701 2.080199 .079701C2.550436 .079701 2.940971-.143462 3.203985-.422416V.079701L4.415442 0V-.263014C3.873474-.263014 3.809714-.318804 3.809714-.70934V-5.531258L2.622167-5.443587ZM3.203985-.988294C3.203985-.844832 3.203985-.812951 3.084433-.653549C2.86127-.334745 2.494645-.143462 2.12005-.143462C1.753425-.143462 1.43462-.334745 1.243337-.629639C1.028144-.940473 .988294-1.331009 .988294-1.705604C.988294-2.16787 1.060025-2.494645 1.243337-2.773599C1.43462-3.068493 1.793275-3.291656 2.199751-3.291656C2.582316-3.291656 2.964882-3.100374 3.203985-2.685928V-.988294Z'/>\n\x3Cpath id='g0-114' d='M1.466501-1.817186C1.466501-2.414944 1.713574-3.275716 2.478705-3.291656C2.430884-3.259776 2.351183-3.196015 2.351183-3.012702C2.351183-2.765629 2.542466-2.654047 2.701868-2.654047C2.893151-2.654047 3.060523-2.781569 3.060523-3.012702C3.060523-3.291656 2.805479-3.514819 2.454795-3.514819C1.936737-3.514819 1.586052-3.124284 1.41868-2.677958H1.41071V-3.514819L.278954-3.427148V-3.164134C.820922-3.164134 .884682-3.108344 .884682-2.717808V-.621669C.884682-.263014 .789041-.263014 .278954-.263014V0C.589788-.02391 1.028144-.02391 1.219427-.02391C1.689664-.02391 1.705604-.02391 2.223661 0V-.263014H2.064259C1.482441-.263014 1.466501-.350685 1.466501-.637609V-1.817186Z'/>\n\x3Cpath id='g0-120' d='M2.454795-1.865006C2.677958-2.14396 2.909091-2.414944 3.148194-2.677958C3.411208-2.956912 3.690162-3.164134 4.192279-3.172105V-3.435118C3.881445-3.411208 3.865504-3.411208 3.506849-3.411208C3.466999-3.411208 2.996762-3.411208 2.749689-3.435118V-3.172105C2.901121-3.156164 2.933001-3.060523 2.933001-2.956912S2.893151-2.757659 2.797509-2.646077L2.295392-2.056289L1.665753-2.805479C1.570112-2.917061 1.570112-2.972852 1.570112-2.988792C1.570112-3.044583 1.617933-3.164134 1.817186-3.172105V-3.435118C1.498381-3.411208 1.052055-3.411208 .964384-3.411208C.820922-3.411208 .414446-3.411208 .175342-3.435118V-3.172105C.71731-3.172105 .72528-3.164134 1.139726-2.677958L1.960648-1.681694L1.235367-.828892C1.036115-.605729 .74122-.278954 .135492-.263014V0C.430386-.02391 .486177-.02391 .820922-.02391C.836862-.02391 1.323039-.02391 1.578082 0V-.263014C1.474471-.278954 1.3868-.334745 1.3868-.478207S1.482441-.73325 1.506351-.773101C1.705604-1.012204 1.920797-1.251308 2.12802-1.482441L2.781569-.70137C2.940971-.518057 2.940971-.502117 2.940971-.446326C2.940971-.382565 2.885181-.270984 2.693898-.263014V0C3.036613-.02391 3.395268-.02391 3.5467-.02391C3.690162-.02391 4.096638-.02391 4.335741 0V-.263014C3.841594-.263014 3.761893-.302864 3.55467-.549938L2.454795-1.865006Z'/>\n\x3Cpath id='g1-101' d='M2.381071-2.30137C2.67995-2.30137 3.347447-2.331258 3.825654-2.520548C4.612702-2.839352 4.612702-3.486924 4.612702-3.556663C4.612702-4.014944 4.244085-4.403487 3.606476-4.403487C2.560399-4.403487 1.135741-3.39726 1.135741-1.633873C1.135741-.737235 1.613948 .109589 2.560399 .109589C3.835616 .109589 4.662516-.886675 4.662516-1.036115C4.662516-1.085928 4.582814-1.195517 4.503113-1.195517C4.463263-1.195517 4.4533-1.185554 4.373599-1.085928C3.636364-.14944 2.749689-.109589 2.580324-.109589C1.932752-.109589 1.823163-.816936 1.823163-1.205479C1.823163-1.58406 1.92279-2.032379 1.992528-2.30137H2.381071ZM2.052304-2.520548C2.480697-4.154421 3.506849-4.184309 3.606476-4.184309C4.004981-4.184309 4.234122-3.915318 4.234122-3.576588C4.234122-2.520548 2.590286-2.520548 2.261519-2.520548H2.052304Z'/>\n\x3Cpath id='g1-102' d='M2.759651-3.985056H3.576588C3.745953-3.985056 3.845579-3.985056 3.845579-4.164384C3.845579-4.293898 3.765878-4.293898 3.596513-4.293898H2.819427C2.958904-5.031133 2.988792-5.210461 3.138232-5.907846C3.217933-6.276463 3.327522-6.804483 3.686177-6.804483C3.765878-6.804483 3.975093-6.784558 4.104608-6.625156C3.805729-6.575342 3.666252-6.336239 3.666252-6.136986C3.666252-5.917808 3.845579-5.818182 4.004981-5.818182C4.254047-5.818182 4.503113-6.017435 4.503113-6.366127C4.503113-6.794521 4.094645-7.023661 3.686177-7.023661C2.709838-7.023661 2.460772-5.728518 2.391034-5.389788L2.181818-4.293898H1.524284C1.364882-4.293898 1.255293-4.293898 1.255293-4.094645C1.255293-3.985056 1.354919-3.985056 1.504359-3.985056H2.122042L1.39477-.268991C1.275218 .348692 1.175592 .757161 1.115816 .966376C1.036115 1.305106 .9066 1.823163 .547945 1.823163C.448319 1.823163 .259029 1.793275 .14944 1.643836C.448319 1.594022 .587796 1.354919 .587796 1.155666C.587796 .936488 .408468 .836862 .249066 .836862C0 .836862-.249066 1.036115-.249066 1.384807C-.249066 1.833126 .179328 2.042341 .547945 2.042341C1.58406 2.042341 1.992528-.049813 2.062267-.408468L2.759651-3.985056Z'/>\n\x3Cpath id='g1-114' d='M2.570361-2.86924C2.580324-2.899128 3.028643-4.184309 3.88543-4.184309C3.935243-4.184309 4.214197-4.184309 4.41345-4.044832C4.064757-3.935243 4.034869-3.616438 4.034869-3.566625C4.034869-3.437111 4.124533-3.247821 4.383562-3.247821C4.562889-3.247821 4.871731-3.387298 4.871731-3.775841C4.871731-4.293898 4.224159-4.403487 3.895392-4.403487C3.20797-4.403487 2.849315-3.905355 2.689913-3.686177C2.580324-4.214197 2.191781-4.403487 1.863014-4.403487C1.504359-4.403487 1.305106-4.174346 1.145704-3.875467C.956413-3.476961 .826899-2.889166 .826899-2.86924C.826899-2.769614 .926526-2.769614 .976339-2.769614C1.105853-2.769614 1.115816-2.779577 1.165629-2.998755C1.344956-3.696139 1.534247-4.184309 1.843088-4.184309C2.102117-4.184309 2.102117-3.895392 2.102117-3.785803C2.102117-3.626401 2.072229-3.437111 2.032379-3.277709L1.285181-.288917C1.265255-.229141 1.255293-.179328 1.255293-.14944C1.255293-.039851 1.334994 .109589 1.534247 .109589C1.833126 .109589 1.902864-.179328 1.92279-.259029L2.570361-2.86924Z'/>\n\x3Cpath id='g3-40' d='M3.297634 2.391034C3.297634 2.361146 3.297634 2.34122 3.128269 2.171856C1.882939 .916563 1.564134-.966376 1.564134-2.49066C1.564134-4.224159 1.942715-5.957659 3.16812-7.202989C3.297634-7.32254 3.297634-7.342466 3.297634-7.372354C3.297634-7.442092 3.257783-7.47198 3.198007-7.47198C3.098381-7.47198 2.201743-6.794521 1.613948-5.529265C1.105853-4.433375 .986301-3.327522 .986301-2.49066C.986301-1.713574 1.09589-.508095 1.643836 .617684C2.241594 1.843088 3.098381 2.49066 3.198007 2.49066C3.257783 2.49066 3.297634 2.460772 3.297634 2.391034Z'/>\n\x3Cpath id='g3-41' d='M2.879203-2.49066C2.879203-3.267746 2.769614-4.473225 2.221669-5.599004C1.62391-6.824408 .767123-7.47198 .667497-7.47198C.607721-7.47198 .56787-7.43213 .56787-7.372354C.56787-7.342466 .56787-7.32254 .757161-7.143213C1.733499-6.156912 2.30137-4.572852 2.30137-2.49066C2.30137-.787049 1.932752 .966376 .697385 2.221669C.56787 2.34122 .56787 2.361146 .56787 2.391034C.56787 2.450809 .607721 2.49066 .667497 2.49066C.767123 2.49066 1.663761 1.8132 2.251557 .547945C2.759651-.547945 2.879203-1.653798 2.879203-2.49066Z'/>\n\x3Cpath id='g3-43' d='M4.07472-2.291407H6.854296C6.993773-2.291407 7.183064-2.291407 7.183064-2.49066S6.993773-2.689913 6.854296-2.689913H4.07472V-5.479452C4.07472-5.618929 4.07472-5.808219 3.875467-5.808219S3.676214-5.618929 3.676214-5.479452V-2.689913H.886675C.747198-2.689913 .557908-2.689913 .557908-2.49066S.747198-2.291407 .886675-2.291407H3.676214V.498132C3.676214 .637609 3.676214 .826899 3.875467 .826899S4.07472 .637609 4.07472 .498132V-2.291407Z'/>\n\x3Cpath id='g3-48' d='M4.582814-3.188045C4.582814-3.985056 4.533001-4.782067 4.184309-5.519303C3.726027-6.475716 2.909091-6.635118 2.49066-6.635118C1.892902-6.635118 1.165629-6.37609 .757161-5.449564C.438356-4.762142 .388543-3.985056 .388543-3.188045C.388543-2.440847 .428394-1.544209 .836862-.787049C1.265255 .019925 1.992528 .219178 2.480697 .219178C3.01868 .219178 3.775841 .009963 4.214197-.936488C4.533001-1.62391 4.582814-2.400996 4.582814-3.188045ZM2.480697 0C2.092154 0 1.504359-.249066 1.325031-1.205479C1.215442-1.803238 1.215442-2.719801 1.215442-3.307597C1.215442-3.945205 1.215442-4.60274 1.295143-5.140722C1.484433-6.326276 2.231631-6.41594 2.480697-6.41594C2.809465-6.41594 3.466999-6.236613 3.656289-5.250311C3.755915-4.692403 3.755915-3.935243 3.755915-3.307597C3.755915-2.560399 3.755915-1.882939 3.646326-1.24533C3.496887-.298879 2.929016 0 2.480697 0Z'/>\n\x3Cpath id='g3-49' d='M2.929016-6.37609C2.929016-6.615193 2.929016-6.635118 2.699875-6.635118C2.082192-5.997509 1.205479-5.997509 .886675-5.997509V-5.688667C1.085928-5.688667 1.673724-5.688667 2.191781-5.947696V-.787049C2.191781-.428394 2.161893-.308842 1.265255-.308842H.946451V0C1.295143-.029888 2.161893-.029888 2.560399-.029888S3.825654-.029888 4.174346 0V-.308842H3.855542C2.958904-.308842 2.929016-.418431 2.929016-.787049V-6.37609Z'/>\n\x3Cpath id='g3-50' d='M1.265255-.767123L2.321295-1.793275C3.875467-3.16812 4.473225-3.706102 4.473225-4.702366C4.473225-5.838107 3.576588-6.635118 2.361146-6.635118C1.235367-6.635118 .498132-5.718555 .498132-4.83188C.498132-4.273973 .996264-4.273973 1.026152-4.273973C1.195517-4.273973 1.544209-4.393524 1.544209-4.801993C1.544209-5.061021 1.364882-5.32005 1.016189-5.32005C.936488-5.32005 .916563-5.32005 .886675-5.310087C1.115816-5.957659 1.653798-6.326276 2.231631-6.326276C3.138232-6.326276 3.566625-5.519303 3.566625-4.702366C3.566625-3.905355 3.068493-3.118306 2.520548-2.500623L.607721-.368618C.498132-.259029 .498132-.239103 .498132 0H4.194271L4.473225-1.733499H4.224159C4.174346-1.43462 4.104608-.996264 4.004981-.846824C3.935243-.767123 3.277709-.767123 3.058531-.767123H1.265255Z'/>\n\x3Cpath id='g3-51' d='M2.889166-3.506849C3.706102-3.775841 4.283935-4.473225 4.283935-5.260274C4.283935-6.07721 3.407223-6.635118 2.450809-6.635118C1.444583-6.635118 .687422-6.03736 .687422-5.280199C.687422-4.951432 .9066-4.762142 1.195517-4.762142C1.504359-4.762142 1.703611-4.98132 1.703611-5.270237C1.703611-5.768369 1.235367-5.768369 1.085928-5.768369C1.39477-6.256538 2.052304-6.386052 2.410959-6.386052C2.819427-6.386052 3.367372-6.166874 3.367372-5.270237C3.367372-5.150685 3.347447-4.572852 3.088418-4.134496C2.789539-3.656289 2.450809-3.626401 2.201743-3.616438C2.122042-3.606476 1.882939-3.58655 1.8132-3.58655C1.733499-3.576588 1.663761-3.566625 1.663761-3.466999C1.663761-3.35741 1.733499-3.35741 1.902864-3.35741H2.34122C3.158157-3.35741 3.526775-2.67995 3.526775-1.703611C3.526775-.348692 2.839352-.059776 2.400996-.059776C1.972603-.059776 1.225405-.229141 .876712-.816936C1.225405-.767123 1.534247-.986301 1.534247-1.364882C1.534247-1.723537 1.265255-1.92279 .976339-1.92279C.737235-1.92279 .418431-1.783313 .418431-1.344956C.418431-.438356 1.344956 .219178 2.430884 .219178C3.646326 .219178 4.552927-.687422 4.552927-1.703611C4.552927-2.520548 3.92528-3.297634 2.889166-3.506849Z'/>\n\x3Cpath id='g3-58' d='M1.912827-3.765878C1.912827-4.054795 1.673724-4.293898 1.384807-4.293898S.856787-4.054795 .856787-3.765878S1.09589-3.237858 1.384807-3.237858S1.912827-3.476961 1.912827-3.765878ZM1.912827-.52802C1.912827-.816936 1.673724-1.05604 1.384807-1.05604S.856787-.816936 .856787-.52802S1.09589 0 1.384807 0S1.912827-.239103 1.912827-.52802Z'/>\n\x3Cpath id='g3-61' d='M6.844334-3.257783C6.993773-3.257783 7.183064-3.257783 7.183064-3.457036S6.993773-3.656289 6.854296-3.656289H.886675C.747198-3.656289 .557908-3.656289 .557908-3.457036S.747198-3.257783 .896638-3.257783H6.844334ZM6.854296-1.325031C6.993773-1.325031 7.183064-1.325031 7.183064-1.524284S6.993773-1.723537 6.844334-1.723537H.896638C.747198-1.723537 .557908-1.723537 .557908-1.524284S.747198-1.325031 .886675-1.325031H6.854296Z'/>\n\x3Cpath id='g3-82' d='M2.231631-3.516812V-6.097136C2.231631-6.326276 2.231631-6.445828 2.450809-6.475716C2.550436-6.495641 2.839352-6.495641 3.038605-6.495641C3.935243-6.495641 5.051059-6.455791 5.051059-5.011208C5.051059-4.323786 4.811955-3.516812 3.337484-3.516812H2.231631ZM4.333748-3.387298C5.300125-3.626401 6.07721-4.234122 6.07721-5.011208C6.07721-5.967621 4.941469-6.804483 3.476961-6.804483H.348692V-6.495641H.587796C1.354919-6.495641 1.374844-6.386052 1.374844-6.027397V-.777086C1.374844-.418431 1.354919-.308842 .587796-.308842H.348692V0C.707347-.029888 1.414695-.029888 1.803238-.029888S2.899128-.029888 3.257783 0V-.308842H3.01868C2.251557-.308842 2.231631-.418431 2.231631-.777086V-3.297634H3.377335C3.536737-3.297634 3.955168-3.297634 4.303861-2.958904C4.682441-2.600249 4.682441-2.291407 4.682441-1.62391C4.682441-.976339 4.682441-.577833 5.090909-.199253C5.499377 .159402 6.047323 .219178 6.346202 .219178C7.123288 .219178 7.292653-.597758 7.292653-.876712C7.292653-.936488 7.292653-1.046077 7.163138-1.046077C7.053549-1.046077 7.053549-.956413 7.043587-.886675C6.983811-.179328 6.635118 0 6.386052 0C5.897883 0 5.818182-.508095 5.678705-1.43462L5.549191-2.231631C5.369863-2.86924 4.881694-3.198007 4.333748-3.387298Z'/>\n\x3Cpath id='g3-86' d='M6.1868-5.828144C6.326276-6.196762 6.595268-6.485679 7.272727-6.495641V-6.804483C6.963885-6.784558 6.56538-6.774595 6.306351-6.774595C6.007472-6.774595 5.429639-6.794521 5.17061-6.804483V-6.495641C5.688667-6.485679 5.897883-6.22665 5.897883-5.997509C5.897883-5.917808 5.867995-5.858032 5.84807-5.798257L4.024907-.996264L2.122042-6.027397C2.062267-6.166874 2.062267-6.1868 2.062267-6.206725C2.062267-6.495641 2.630137-6.495641 2.879203-6.495641V-6.804483C2.520548-6.774595 1.833126-6.774595 1.454545-6.774595C.976339-6.774595 .547945-6.794521 .18929-6.804483V-6.495641C.836862-6.495641 1.026152-6.495641 1.165629-6.117061L3.476961 0C3.5467 .18929 3.596513 .219178 3.726027 .219178C3.895392 .219178 3.915318 .169365 3.965131 .029888L6.1868-5.828144Z'/>\n\x3Cpath id='g3-97' d='M3.317559-.757161C3.35741-.358655 3.626401 .059776 4.094645 .059776C4.303861 .059776 4.911582-.079701 4.911582-.886675V-1.444583H4.662516V-.886675C4.662516-.308842 4.41345-.249066 4.303861-.249066C3.975093-.249066 3.935243-.697385 3.935243-.747198V-2.739726C3.935243-3.158157 3.935243-3.5467 3.576588-3.915318C3.188045-4.303861 2.689913-4.463263 2.211706-4.463263C1.39477-4.463263 .707347-3.995019 .707347-3.337484C.707347-3.038605 .9066-2.86924 1.165629-2.86924C1.444583-2.86924 1.62391-3.068493 1.62391-3.327522C1.62391-3.447073 1.574097-3.775841 1.115816-3.785803C1.384807-4.134496 1.872976-4.244085 2.191781-4.244085C2.67995-4.244085 3.247821-3.855542 3.247821-2.968867V-2.600249C2.739726-2.570361 2.042341-2.540473 1.414695-2.241594C.667497-1.902864 .418431-1.384807 .418431-.946451C.418431-.139477 1.384807 .109589 2.012453 .109589C2.669988 .109589 3.128269-.288917 3.317559-.757161ZM3.247821-2.391034V-1.39477C3.247821-.448319 2.530511-.109589 2.082192-.109589C1.594022-.109589 1.185554-.458281 1.185554-.956413C1.185554-1.504359 1.603985-2.331258 3.247821-2.391034Z'/>\n\x3Cpath id='g3-98' d='M1.713574-3.755915V-6.914072L.278954-6.804483V-6.495641C.976339-6.495641 1.05604-6.425903 1.05604-5.937733V0H1.305106C1.315068-.009963 1.39477-.14944 1.663761-.617684C1.8132-.388543 2.231631 .109589 2.968867 .109589C4.154421 .109589 5.190535-.86675 5.190535-2.15193C5.190535-3.417186 4.214197-4.403487 3.078456-4.403487C2.30137-4.403487 1.872976-3.935243 1.713574-3.755915ZM1.743462-1.135741V-3.188045C1.743462-3.377335 1.743462-3.387298 1.853051-3.5467C2.241594-4.104608 2.789539-4.184309 3.028643-4.184309C3.476961-4.184309 3.835616-3.92528 4.07472-3.5467C4.333748-3.138232 4.363636-2.570361 4.363636-2.161893C4.363636-1.793275 4.343711-1.195517 4.054795-.747198C3.845579-.438356 3.466999-.109589 2.929016-.109589C2.480697-.109589 2.122042-.348692 1.882939-.71731C1.743462-.926526 1.743462-.956413 1.743462-1.135741Z'/>\n\x3Cpath id='g3-99' d='M1.165629-2.171856C1.165629-3.795766 1.982565-4.214197 2.510585-4.214197C2.600249-4.214197 3.227895-4.204234 3.576588-3.845579C3.16812-3.815691 3.108344-3.516812 3.108344-3.387298C3.108344-3.128269 3.287671-2.929016 3.566625-2.929016C3.825654-2.929016 4.024907-3.098381 4.024907-3.39726C4.024907-4.07472 3.267746-4.463263 2.500623-4.463263C1.255293-4.463263 .33873-3.387298 .33873-2.15193C.33873-.876712 1.325031 .109589 2.480697 .109589C3.815691 .109589 4.134496-1.085928 4.134496-1.185554S4.034869-1.285181 4.004981-1.285181C3.915318-1.285181 3.895392-1.24533 3.875467-1.185554C3.58655-.259029 2.938979-.139477 2.570361-.139477C2.042341-.139477 1.165629-.56787 1.165629-2.171856Z'/>\n\x3Cpath id='g3-101' d='M1.115816-2.510585C1.175592-3.995019 2.012453-4.244085 2.351183-4.244085C3.377335-4.244085 3.476961-2.899128 3.476961-2.510585H1.115816ZM1.105853-2.30137H3.88543C4.104608-2.30137 4.134496-2.30137 4.134496-2.510585C4.134496-3.496887 3.596513-4.463263 2.351183-4.463263C1.195517-4.463263 .278954-3.437111 .278954-2.191781C.278954-.856787 1.325031 .109589 2.470735 .109589C3.686177 .109589 4.134496-.996264 4.134496-1.185554C4.134496-1.285181 4.054795-1.305106 4.004981-1.305106C3.915318-1.305106 3.895392-1.24533 3.875467-1.165629C3.526775-.139477 2.630137-.139477 2.530511-.139477C2.032379-.139477 1.633873-.438356 1.404732-.806974C1.105853-1.285181 1.105853-1.942715 1.105853-2.30137Z'/>\n\x3Cpath id='g3-108' d='M1.763387-6.914072L.328767-6.804483V-6.495641C1.026152-6.495641 1.105853-6.425903 1.105853-5.937733V-.757161C1.105853-.308842 .996264-.308842 .328767-.308842V0C.657534-.009963 1.185554-.029888 1.43462-.029888S2.171856-.009963 2.540473 0V-.308842C1.872976-.308842 1.763387-.308842 1.763387-.757161V-6.914072Z'/>\n\x3Cpath id='g3-117' d='M3.895392-.787049V.109589L5.330012 0V-.308842C4.632628-.308842 4.552927-.37858 4.552927-.86675V-4.403487L3.088418-4.293898V-3.985056C3.785803-3.985056 3.865504-3.915318 3.865504-3.427148V-1.653798C3.865504-.787049 3.387298-.109589 2.660025-.109589C1.823163-.109589 1.783313-.577833 1.783313-1.09589V-4.403487L.318804-4.293898V-3.985056C1.09589-3.985056 1.09589-3.955168 1.09589-3.068493V-1.574097C1.09589-.797011 1.09589 .109589 2.610212 .109589C3.16812 .109589 3.606476-.169365 3.895392-.787049Z'/>\n\x3Cpath id='g2-48' d='M5.270237-3.178082C5.270237-4.144458 5.260274-6.525529 2.859278-6.525529S.448319-4.154421 .448319-3.178082C.448319-2.191781 .458281 .109589 2.859278 .109589C5.250311 .109589 5.270237-2.181818 5.270237-3.178082ZM2.859278-.249066C2.500623-.249066 1.942715-.468244 1.8132-1.195517C1.723537-1.713574 1.723537-2.749689 1.723537-3.297634C1.723537-4.014944 1.723537-4.662516 1.803238-5.180573C1.92279-6.067248 2.620174-6.166874 2.859278-6.166874C3.227895-6.166874 3.636364-5.977584 3.825654-5.539228C3.995019-5.17061 3.995019-4.11457 3.995019-3.297634C3.995019-2.739726 3.995019-1.833126 3.92528-1.315068C3.785803-.388543 3.158157-.249066 2.859278-.249066Z'/>\n\x3Cpath id='g2-49' d='M3.526775-6.206725C3.526775-6.425903 3.526775-6.525529 3.267746-6.525529C3.158157-6.525529 3.138232-6.525529 3.048568-6.455791C2.281445-5.88792 1.255293-5.88792 1.046077-5.88792H.846824V-5.419676H1.046077C1.205479-5.419676 1.753425-5.429639 2.34122-5.618929V-.468244H.956413V0C1.39477-.029888 2.450809-.029888 2.938979-.029888S4.483188-.029888 4.921544 0V-.468244H3.526775V-6.206725Z'/>\n\x3Cpath id='g2-50' d='M5.150685-2.211706H4.682441C4.652553-2.012453 4.562889-1.374844 4.423412-1.305106C4.313823-1.24533 3.566625-1.24533 3.407223-1.24533H1.942715C2.410959-1.633873 2.929016-2.062267 3.377335-2.391034C4.513076-3.227895 5.150685-3.696139 5.150685-4.64259C5.150685-5.788294 4.11457-6.525529 2.709838-6.525529C1.504359-6.525529 .56787-5.907846 .56787-5.011208C.56787-4.423412 1.046077-4.273973 1.285181-4.273973C1.603985-4.273973 2.002491-4.493151 2.002491-4.991283C2.002491-5.50934 1.58406-5.668742 1.43462-5.708593C1.723537-5.947696 2.102117-6.057285 2.460772-6.057285C3.317559-6.057285 3.775841-5.379826 3.775841-4.632628C3.775841-3.945205 3.39726-3.267746 2.699875-2.560399L.697385-.518057C.56787-.398506 .56787-.37858 .56787-.179328V0H4.841843L5.150685-2.211706Z'/>\n\x3Cpath id='g2-51' d='M3.506849-3.506849C4.194271-3.716065 4.921544-4.283935 4.921544-5.140722C4.921544-5.907846 4.164384-6.525529 2.759651-6.525529C1.574097-6.525529 .797011-5.88792 .797011-5.090909C.797011-4.662516 1.105853-4.393524 1.484433-4.393524C1.932752-4.393524 2.181818-4.712329 2.181818-5.080946C2.181818-5.65878 1.643836-5.768369 1.603985-5.778331C1.952677-6.057285 2.391034-6.136986 2.699875-6.136986C3.526775-6.136986 3.556663-5.499377 3.556663-5.17061C3.556663-5.041096 3.5467-3.73599 2.510585-3.676214C2.102117-3.656289 2.082192-3.646326 2.032379-3.636364C1.932752-3.626401 1.912827-3.526775 1.912827-3.466999C1.912827-3.287671 2.012453-3.287671 2.191781-3.287671H2.630137C3.716065-3.287671 3.716065-2.311333 3.716065-1.803238C3.716065-1.334994 3.716065-.318804 2.67995-.318804C2.420922-.318804 1.902864-.358655 1.424658-.657534C1.753425-.747198 2.002491-.996264 2.002491-1.404732C2.002491-1.853051 1.683686-2.161893 1.24533-2.161893C.826899-2.161893 .478207-1.892902 .478207-1.384807C.478207-.488169 1.444583 .109589 2.729763 .109589C4.513076 .109589 5.240349-.886675 5.240349-1.793275C5.240349-2.34122 4.951432-3.198007 3.506849-3.506849Z'/>\n\x3Cpath id='g2-67' d='M7.631382-6.665006C7.631382-6.854296 7.631382-6.94396 7.452055-6.94396C7.362391-6.94396 7.342466-6.924035 7.262765-6.854296L6.60523-6.266501C5.987547-6.764633 5.32005-6.94396 4.64259-6.94396C2.161893-6.94396 .637609-5.459527 .637609-3.417186S2.161893 .109589 4.64259 .109589C6.505604 .109589 7.631382-1.115816 7.631382-2.261519C7.631382-2.460772 7.561644-2.470735 7.392279-2.470735C7.262765-2.470735 7.173101-2.470735 7.163138-2.30137C7.0934-.966376 5.88792-.358655 4.881694-.358655C4.104608-.358655 3.267746-.597758 2.749689-1.205479C2.281445-1.77335 2.161893-2.520548 2.161893-3.417186C2.161893-3.975093 2.191781-5.051059 2.819427-5.708593C3.466999-6.366127 4.333748-6.475716 4.851806-6.475716C5.927771-6.475716 6.874222-5.718555 7.0934-4.4533C7.123288-4.26401 7.13325-4.244085 7.362391-4.244085C7.62142-4.244085 7.631382-4.26401 7.631382-4.523039V-6.665006Z'/>\n\x3Cpath id='g2-73' d='M2.879203-6.366127H4.014944V-6.834371C3.606476-6.804483 2.630137-6.804483 2.171856-6.804483S.737235-6.804483 .328767-6.834371V-6.366127H1.464508V-.468244H.328767V0C.737235-.029888 1.713574-.029888 2.171856-.029888S3.606476-.029888 4.014944 0V-.468244H2.879203V-6.366127Z'/>\n\x3Cpath id='g2-77' d='M5.439601-1.315068L3.048568-6.585305C2.938979-6.834371 2.82939-6.834371 2.610212-6.834371H.398506V-6.366127H1.474471V-.757161C1.474471-.537983 1.464508-.52802 1.185554-.498132C.946451-.468244 .926526-.468244 .647572-.468244H.398506V0C.777086-.029888 1.344956-.029888 1.733499-.029888C2.15193-.029888 2.669988-.029888 3.078456 0V-.468244H2.82939C2.650062-.468244 2.480697-.478207 2.30137-.498132C2.012453-.52802 2.002491-.537983 2.002491-.757161V-6.236613H2.012453L4.722291-.249066C4.811955-.049813 4.931507 0 5.041096 0C5.240349 0 5.32005-.14944 5.3599-.239103L8.139477-6.366127H8.14944V-.468244H7.073474V0C7.43213-.029888 8.358655-.029888 8.767123-.029888S10.11208-.029888 10.470735 0V-.468244H9.39477V-6.366127H10.470735V-6.834371H8.268991C8.049813-6.834371 7.940224-6.834371 7.830635-6.585305L5.439601-1.315068Z'/>\n\x3Cpath id='g2-80' d='M2.879203-3.008717H4.64259C6.027397-3.008717 7.183064-3.726027 7.183064-4.891656C7.183064-5.987547 6.196762-6.834371 4.542964-6.834371H.388543V-6.366127H1.464508V-.468244H.388543V0C.767123-.029888 1.743462-.029888 2.171856-.029888S3.576588-.029888 3.955168 0V-.468244H2.879203V-3.008717ZM4.154421-3.417186H2.819427V-6.366127H4.164384C5.65878-6.366127 5.65878-5.608966 5.65878-4.891656C5.65878-4.184309 5.65878-3.417186 4.154421-3.417186Z'/>\n\x3Cpath id='g2-82' d='M2.819427-3.596513V-6.366127H3.995019C5.599004-6.366127 5.618929-5.589041 5.618929-4.98132C5.618929-4.423412 5.618929-3.596513 3.975093-3.596513H2.819427ZM5.479452-3.387298C6.635118-3.686177 7.143213-4.333748 7.143213-4.991283C7.143213-5.997509 6.047323-6.834371 4.174346-6.834371H.388543V-6.366127H1.464508V-.468244H.388543V0C.747198-.029888 1.723537-.029888 2.141968-.029888S3.536737-.029888 3.895392 0V-.468244H2.819427V-3.237858H3.985056C4.124533-3.237858 4.562889-3.237858 4.871731-2.899128C5.190535-2.550436 5.190535-2.361146 5.190535-1.633873C5.190535-.976339 5.190535-.488169 5.88792-.14944C6.326276 .069738 6.94396 .109589 7.352428 .109589C8.418431 .109589 8.547945-.787049 8.547945-.946451C8.547945-1.165629 8.408468-1.165629 8.308842-1.165629C8.099626-1.165629 8.089664-1.066002 8.079701-.936488C8.029888-.468244 7.740971-.249066 7.442092-.249066C6.844334-.249066 6.75467-.956413 6.704857-1.374844C6.684932-1.484433 6.60523-2.171856 6.595268-2.221669C6.455791-2.919054 5.907846-3.227895 5.479452-3.387298Z'/>\n\x3Cpath id='g2-85' d='M7.342466-6.07721C7.342466-6.296389 7.352428-6.306351 7.631382-6.336239C7.870486-6.366127 7.890411-6.366127 8.169365-6.366127H8.418431V-6.834371C8.039851-6.804483 7.47198-6.804483 7.083437-6.804483C6.665006-6.804483 6.146949-6.804483 5.738481-6.834371V-6.366127H5.987547C6.166874-6.366127 6.336239-6.356164 6.515567-6.336239C6.804483-6.306351 6.814446-6.296389 6.814446-6.07721V-2.321295C6.814446-.846824 5.728518-.358655 4.64259-.358655C2.899128-.358655 2.879203-1.663761 2.879203-2.221669V-6.366127H3.955168V-6.834371C3.576588-6.804483 2.600249-6.804483 2.171856-6.804483S.767123-6.804483 .388543-6.834371V-6.366127H1.464508V-2.30137C1.464508-.976339 2.540473 .109589 4.60274 .109589C6.495641 .109589 7.342466-1.05604 7.342466-2.281445V-6.07721Z'/>\n\x3Cpath id='g2-97' d='M3.726027-.767123C3.726027-.458281 3.726027 0 4.762142 0H5.240349C5.439601 0 5.559153 0 5.559153-.239103C5.559153-.468244 5.429639-.468244 5.300125-.468244C4.692403-.478207 4.692403-.607721 4.692403-.836862V-2.978829C4.692403-3.865504 3.985056-4.513076 2.500623-4.513076C1.932752-4.513076 .71731-4.473225 .71731-3.596513C.71731-3.158157 1.066002-2.968867 1.334994-2.968867C1.643836-2.968867 1.96264-3.178082 1.96264-3.596513C1.96264-3.895392 1.77335-4.064757 1.743462-4.084682C2.022416-4.144458 2.34122-4.154421 2.460772-4.154421C3.20797-4.154421 3.556663-3.73599 3.556663-2.978829V-2.6401C2.849315-2.610212 .318804-2.520548 .318804-1.075965C.318804-.119552 1.554172 .059776 2.241594 .059776C3.038605 .059776 3.506849-.348692 3.726027-.767123ZM3.556663-2.331258V-1.384807C3.556663-.428394 2.6401-.298879 2.391034-.298879C1.882939-.298879 1.484433-.647572 1.484433-1.085928C1.484433-2.161893 3.058531-2.30137 3.556663-2.331258Z'/>\n\x3Cpath id='g2-100' d='M4.164384-.428394V.059776L5.987547 0V-.468244C5.369863-.468244 5.300125-.468244 5.300125-.856787V-6.914072L3.536737-6.834371V-6.366127C4.154421-6.366127 4.224159-6.366127 4.224159-5.977584V-4.034869C3.726027-4.423412 3.20797-4.483188 2.879203-4.483188C1.424658-4.483188 .37858-3.606476 .37858-2.201743C.37858-.886675 1.295143 .059776 2.769614 .059776C3.377335 .059776 3.855542-.179328 4.164384-.428394ZM4.164384-3.516812V-1.026152C4.034869-.846824 3.626401-.298879 2.86924-.298879C1.653798-.298879 1.653798-1.504359 1.653798-2.201743C1.653798-2.67995 1.653798-3.217933 1.912827-3.606476C2.201743-4.024907 2.669988-4.124533 2.978829-4.124533C3.5467-4.124533 3.945205-3.805729 4.164384-3.516812Z'/>\n\x3Cpath id='g2-101' d='M4.60274-2.171856C4.821918-2.171856 4.921544-2.171856 4.921544-2.440847C4.921544-2.749689 4.861768-3.476961 4.363636-3.975093C3.995019-4.333748 3.466999-4.513076 2.779577-4.513076C1.185554-4.513076 .318804-3.486924 .318804-2.241594C.318804-.9066 1.315068 .059776 2.919054 .059776C4.493151 .059776 4.921544-.996264 4.921544-1.165629C4.921544-1.344956 4.732254-1.344956 4.682441-1.344956C4.513076-1.344956 4.493151-1.295143 4.433375-1.135741C4.224159-.657534 3.656289-.33873 3.008717-.33873C1.603985-.33873 1.594022-1.663761 1.594022-2.171856H4.60274ZM1.594022-2.500623C1.613948-2.889166 1.62391-3.307597 1.833126-3.636364C2.092154-4.034869 2.49066-4.154421 2.779577-4.154421C3.945205-4.154421 3.965131-2.849315 3.975093-2.500623H1.594022Z'/>\n\x3Cpath id='g2-103' d='M2.540473-1.892902C1.663761-1.892902 1.663761-2.560399 1.663761-3.008717S1.663761-4.124533 2.540473-4.124533S3.417186-3.457036 3.417186-3.008717S3.417186-1.892902 2.540473-1.892902ZM1.325031-1.793275C1.783313-1.554172 2.291407-1.534247 2.540473-1.534247C3.975093-1.534247 4.523039-2.311333 4.523039-3.008717C4.523039-3.476961 4.273973-3.805729 4.124533-3.965131C4.423412-4.124533 4.632628-4.144458 4.742217-4.154421C4.722291-4.104608 4.702366-4.014944 4.702366-3.955168C4.702366-3.706102 4.871731-3.526775 5.13076-3.526775S5.559153-3.716065 5.559153-3.955168C5.559153-4.184309 5.389788-4.533001 4.931507-4.533001C4.782067-4.533001 4.313823-4.503113 3.875467-4.154421C3.696139-4.273973 3.277709-4.483188 2.540473-4.483188C1.105853-4.483188 .557908-3.706102 .557908-3.008717C.557908-2.600249 .757161-2.191781 1.075965-1.96264C.797011-1.613948 .737235-1.285181 .737235-1.075965C.737235-.926526 .777086-.438356 1.175592-.119552C1.046077-.089664 .318804 .119552 .318804 .747198C.318804 1.255293 .86675 2.002491 2.859278 2.002491C4.622665 2.002491 5.399751 1.414695 5.399751 .71731C5.399751 .418431 5.32005-.209215 4.652553-.547945C4.094645-.826899 3.496887-.826899 2.540473-.826899C2.281445-.826899 1.823163-.826899 1.77335-.836862C1.334994-.9066 1.225405-1.285181 1.225405-1.464508C1.225405-1.564134 1.265255-1.713574 1.325031-1.793275ZM1.942715 .129514H3.108344C3.417186 .129514 4.542964 .129514 4.542964 .747198C4.542964 1.105853 4.154421 1.643836 2.859278 1.643836C1.663761 1.643836 1.175592 1.185554 1.175592 .727273C1.175592 .129514 1.803238 .129514 1.942715 .129514Z'/>\n\x3Cpath id='g2-105' d='M2.231631-4.483188L.498132-4.403487V-3.935243C1.085928-3.935243 1.155666-3.935243 1.155666-3.5467V-.468244H.468244V0C.777086-.009963 1.265255-.029888 1.683686-.029888C1.982565-.029888 2.49066-.009963 2.849315 0V-.468244H2.231631V-4.483188ZM2.331258-6.146949C2.331258-6.585305 1.972603-6.924035 1.554172-6.924035C1.125778-6.924035 .777086-6.575342 .777086-6.146949S1.125778-5.369863 1.554172-5.369863C1.972603-5.369863 2.331258-5.708593 2.331258-6.146949Z'/>\n\x3Cpath id='g2-109' d='M1.135741-3.5467V-.468244H.448319V0C.727273-.009963 1.325031-.029888 1.703611-.029888C2.092154-.029888 2.67995-.009963 2.958904 0V-.468244H2.271482V-2.550436C2.271482-3.636364 3.138232-4.124533 3.755915-4.124533C4.094645-4.124533 4.313823-3.92528 4.313823-3.158157V-.468244H3.626401V0C3.905355-.009963 4.503113-.029888 4.881694-.029888C5.270237-.029888 5.858032-.009963 6.136986 0V-.468244H5.449564V-2.550436C5.449564-3.636364 6.316314-4.124533 6.933998-4.124533C7.272727-4.124533 7.491905-3.92528 7.491905-3.158157V-.468244H6.804483V0C7.083437-.009963 7.681196-.029888 8.059776-.029888C8.448319-.029888 9.036115-.009963 9.315068 0V-.468244H8.627646V-3.048568C8.627646-4.07472 8.119552-4.483188 7.0934-4.483188C6.1868-4.483188 5.668742-3.985056 5.409714-3.526775C5.210461-4.4533 4.293898-4.483188 3.915318-4.483188C3.048568-4.483188 2.480697-4.034869 2.161893-3.407223V-4.483188L.448319-4.403487V-3.935243C1.066002-3.935243 1.135741-3.935243 1.135741-3.5467Z'/>\n\x3Cpath id='g2-110' d='M1.135741-3.5467V-.468244H.448319V0C.727273-.009963 1.325031-.029888 1.703611-.029888C2.092154-.029888 2.67995-.009963 2.958904 0V-.468244H2.271482V-2.550436C2.271482-3.636364 3.128269-4.124533 3.755915-4.124533C4.094645-4.124533 4.303861-3.915318 4.303861-3.158157V-.468244H3.616438V0C3.895392-.009963 4.493151-.029888 4.871731-.029888C5.260274-.029888 5.84807-.009963 6.127024 0V-.468244H5.439601V-3.048568C5.439601-4.094645 4.901619-4.483188 3.905355-4.483188C2.948941-4.483188 2.420922-3.915318 2.161893-3.407223V-4.483188L.448319-4.403487V-3.935243C1.066002-3.935243 1.135741-3.935243 1.135741-3.5467Z'/>\n\x3Cpath id='g2-111' d='M5.399751-2.171856C5.399751-3.506849 4.483188-4.513076 2.859278-4.513076C1.225405-4.513076 .318804-3.496887 .318804-2.171856C.318804-.936488 1.195517 .059776 2.859278 .059776C4.533001 .059776 5.399751-.946451 5.399751-2.171856ZM2.859278-.33873C1.594022-.33873 1.594022-1.414695 1.594022-2.281445C1.594022-2.729763 1.594022-3.237858 1.763387-3.576588C1.952677-3.945205 2.371108-4.154421 2.859278-4.154421C3.277709-4.154421 3.696139-3.995019 3.915318-3.646326C4.124533-3.307597 4.124533-2.759651 4.124533-2.281445C4.124533-1.414695 4.124533-.33873 2.859278-.33873Z'/>\n\x3Cpath id='g2-114' d='M2.022416-3.35741V-4.483188L.368618-4.403487V-3.935243C.986301-3.935243 1.05604-3.935243 1.05604-3.5467V-.468244H.368618V0C.71731-.009963 1.165629-.029888 1.62391-.029888C2.002491-.029888 2.6401-.029888 2.998755 0V-.468244H2.132005V-2.211706C2.132005-2.909091 2.381071-4.124533 3.377335-4.124533C3.367372-4.11457 3.188045-3.955168 3.188045-3.666252C3.188045-3.257783 3.506849-3.058531 3.795766-3.058531S4.403487-3.267746 4.403487-3.666252C4.403487-4.194271 3.865504-4.483188 3.347447-4.483188C2.650062-4.483188 2.251557-3.985056 2.022416-3.35741Z'/>\n\x3Cpath id='g2-115' d='M2.102117-2.929016C1.733499-2.998755 1.085928-3.108344 1.085928-3.576588C1.085928-4.194271 2.012453-4.194271 2.201743-4.194271C2.948941-4.194271 3.327522-3.905355 3.377335-3.35741C3.387298-3.20797 3.39726-3.158157 3.606476-3.158157C3.845579-3.158157 3.845579-3.20797 3.845579-3.437111V-4.234122C3.845579-4.423412 3.845579-4.513076 3.666252-4.513076C3.626401-4.513076 3.606476-4.513076 3.217933-4.323786C2.958904-4.4533 2.610212-4.513076 2.211706-4.513076C1.912827-4.513076 .37858-4.513076 .37858-3.20797C.37858-2.809465 .577833-2.540473 .777086-2.371108C1.175592-2.022416 1.554172-1.96264 2.321295-1.823163C2.67995-1.763387 3.427148-1.633873 3.427148-1.046077C3.427148-.298879 2.510585-.298879 2.291407-.298879C1.235367-.298879 .976339-1.026152 .856787-1.454545C.806974-1.594022 .757161-1.594022 .617684-1.594022C.37858-1.594022 .37858-1.534247 .37858-1.305106V-.219178C.37858-.029888 .37858 .059776 .557908 .059776C.627646 .059776 .647572 .059776 .856787-.089664C.86675-.089664 1.085928-.239103 1.115816-.259029C1.574097 .059776 2.092154 .059776 2.291407 .059776C2.600249 .059776 4.134496 .059776 4.134496-1.39477C4.134496-1.823163 3.935243-2.171856 3.58655-2.450809C3.198007-2.739726 2.879203-2.799502 2.102117-2.929016Z'/>\n\x3Cpath id='g2-116' d='M1.026152-3.955168V-1.225405C1.026152-.159402 1.892902 .059776 2.600249 .059776C3.35741 .059776 3.805729-.508095 3.805729-1.235367V-1.763387H3.337484V-1.255293C3.337484-.577833 3.01868-.33873 2.739726-.33873C2.161893-.33873 2.161893-.976339 2.161893-1.205479V-3.955168H3.616438V-4.423412H2.161893V-6.326276H1.693649C1.683686-5.330012 1.195517-4.343711 .209215-4.313823V-3.955168H1.026152Z'/>\n\x3Cpath id='g2-121' d='M5.041096-3.745953C5.110834-3.88543 5.140722-3.955168 5.778331-3.955168V-4.423412C5.539228-4.403487 5.240349-4.393524 4.991283-4.393524S4.293898-4.41345 4.084682-4.423412V-3.955168C4.104608-3.955168 4.552927-3.955168 4.552927-3.835616C4.552927-3.825654 4.513076-3.726027 4.503113-3.716065L3.35741-1.265255L2.092154-3.955168H2.630137V-4.423412C2.30137-4.403487 1.404732-4.393524 1.39477-4.393524C1.115816-4.393524 .667497-4.41345 .259029-4.423412V-3.955168H.896638L2.759651 0L2.530511 .478207C2.311333 .956413 1.992528 1.633873 1.285181 1.633873C1.145704 1.633873 1.125778 1.62391 1.046077 1.594022C1.135741 1.554172 1.364882 1.414695 1.364882 1.066002C1.364882 .737235 1.125778 .498132 .787049 .498132C.508095 .498132 .219178 .687422 .219178 1.075965C.219178 1.58406 .687422 1.992528 1.285181 1.992528C2.052304 1.992528 2.630137 1.374844 2.899128 .806974L5.041096-3.745953Z'/>\n\x3C/defs>\n\x3Cg id='page1'>\n\x3Cg transform='translate(198.142 305.438)scale(.996264)'>\n\x3Cpath d='M 63.5072 95.0098L 221.02 95.0098L 221.02 0.501875L 63.5072 0.501875L 63.5072 95.0098Z' fill='#c0ffff' opacity='0.2'/>\n\x3C/g>\n\x3Cg transform='translate(198.142 305.438)scale(.996264)'>\n\x3Cpath d='M 63.5072 95.0098L 221.02 95.0098L 221.02 0.501875L 63.5072 0.501875L 63.5072 95.0098Z' fill='none' stroke='#333333' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1.00375'/>\n\x3C/g>\n\x3Cuse x='292.780385' y='321.891099' xlink:href='#g2-73'/>\n\x3Cuse x='297.125187' y='321.891099' xlink:href='#g2-110'/>\n\x3Cuse x='303.171924' y='321.891099' xlink:href='#g2-116'/>\n\x3Cuse x='307.627414' y='321.891099' xlink:href='#g2-101'/>\n\x3Cuse x='312.878538' y='321.891099' xlink:href='#g2-114'/>\n\x3Cuse x='317.596943' y='321.891099' xlink:href='#g2-109'/>\n\x3Cuse x='327.144422' y='321.891099' xlink:href='#g2-101'/>\n\x3Cuse x='332.395546' y='321.891099' xlink:href='#g2-100'/>\n\x3Cuse x='338.760532' y='321.891099' xlink:href='#g2-105'/>\n\x3Cuse x='341.943025' y='321.891099' xlink:href='#g2-97'/>\n\x3Cuse x='347.512378' y='321.891099' xlink:href='#g2-116'/>\n\x3Cuse x='351.967869' y='321.891099' xlink:href='#g2-101'/>\n\x3Cuse x='361.037984' y='321.891099' xlink:href='#g2-67'/>\n\x3Cuse x='369.312466' y='321.891099' xlink:href='#g2-111'/>\n\x3Cuse x='375.359203' y='321.891099' xlink:href='#g2-100'/>\n\x3Cuse x='381.724189' y='321.891099' xlink:href='#g2-101'/>\n\x3Cuse x='327.224902' y='340.472997' xlink:href='#g3-97'/>\n\x3Cuse x='335.527116' y='340.472997' xlink:href='#g3-61'/>\n\x3Cuse x='346.596739' y='340.472997' xlink:href='#g3-49'/>\n\x3Cuse x='351.578078' y='340.472997' xlink:href='#g3-48'/>\n\x3Cuse x='327.224902' y='359.553028' xlink:href='#g3-98'/>\n\x3Cuse x='336.080594' y='359.553028' xlink:href='#g3-61'/>\n\x3Cuse x='347.150217' y='359.553028' xlink:href='#g3-50'/>\n\x3Cuse x='352.131556' y='359.553028' xlink:href='#g3-48'/>\n\x3Cuse x='327.224902' y='377.968862' xlink:href='#g3-99'/>\n\x3Cuse x='334.973629' y='377.968862' xlink:href='#g3-61'/>\n\x3Cuse x='346.043252' y='377.968862' xlink:href='#g3-97'/>\n\x3Cuse x='354.345466' y='377.968862' xlink:href='#g3-43'/>\n\x3Cuse x='365.415088' y='377.968862' xlink:href='#g3-98'/>\n\x3Cg transform='translate(198.142 305.438)scale(.996264)'>\n\x3Cpath d='M 0.501875 284.026L 126.512 284.026L 126.512 126.512L 0.501875 126.512L 0.501875 284.026Z' fill='#c0ffc0' opacity='0.2'/>\n\x3C/g>\n\x3Cg transform='translate(198.142 305.438)scale(.996264)'>\n\x3Cpath d='M 0.501875 284.026L 126.512 284.026L 126.512 126.512L 0.501875 126.512L 0.501875 284.026Z' fill='none' stroke='#333333' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1.00375'/>\n\x3C/g>\n\x3Cuse x='223.936772' y='446.462302' xlink:href='#g2-67'/>\n\x3Cuse x='232.211254' y='446.462302' xlink:href='#g2-80'/>\n\x3Cuse x='240.042956' y='446.462302' xlink:href='#g2-85'/>\n\x3Cuse x='252.676074' y='446.462302' xlink:href='#g2-82'/>\n\x3Cuse x='261.268806' y='446.462302' xlink:href='#g2-101'/>\n\x3Cuse x='266.519929' y='446.462302' xlink:href='#g2-103'/>\n\x3Cuse x='272.248417' y='446.462302' xlink:href='#g2-105'/>\n\x3Cuse x='275.43091' y='446.462302' xlink:href='#g2-115'/>\n\x3Cuse x='279.950048' y='446.462302' xlink:href='#g2-116'/>\n\x3Cuse x='284.405538' y='446.462302' xlink:href='#g2-101'/>\n\x3Cuse x='289.656662' y='446.462302' xlink:href='#g2-114'/>\n\x3Cuse x='294.375067' y='446.462302' xlink:href='#g2-115'/>\n\x3Cg transform='translate(198.142 305.438)scale(.996264)'>\n\x3Cpath d='M 19.4035 176.917L 107.611 176.917L 107.611 151.715L 19.4035 151.715L 19.4035 176.917Z' fill='#ffffff'/>\n\x3C/g>\n\x3Cg transform='translate(198.142 305.438)scale(.996264)'>\n\x3Cpath d='M 19.4035 176.917L 107.611 176.917L 107.611 151.715L 19.4035 151.715L 19.4035 176.917Z' fill='none' stroke='#333333' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1.00375'/>\n\x3C/g>\n\x3Cuse x='222.489319' y='472.483512' xlink:href='#g3-82'/>\n\x3Cuse x='229.822944' y='472.483512' xlink:href='#g3-49'/>\n\x3Cuse x='234.804283' y='472.483512' xlink:href='#g3-58'/>\n\x3Cg fill='#060'>\n\x3Cuse x='271.379437' y='472.289796' xlink:href='#g2-49'/>\n\x3Cuse x='277.107925' y='472.289796' xlink:href='#g2-48'/>\n\x3C/g>\n\x3Cg transform='translate(198.142 305.438)scale(.996264)'>\n\x3Cpath d='M 19.4035 214.72L 107.611 214.72L 107.611 189.518L 19.4035 189.518L 19.4035 214.72Z' fill='#ffffff'/>\n\x3C/g>\n\x3Cg transform='translate(198.142 305.438)scale(.996264)'>\n\x3Cpath d='M 19.4035 214.72L 107.611 214.72L 107.611 189.518L 19.4035 189.518L 19.4035 214.72Z' fill='none' stroke='#333333' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1.00375'/>\n\x3C/g>\n\x3Cuse x='222.489319' y='510.145457' xlink:href='#g3-82'/>\n\x3Cuse x='229.822944' y='510.145457' xlink:href='#g3-50'/>\n\x3Cuse x='234.804283' y='510.145457' xlink:href='#g3-58'/>\n\x3Cg fill='#060'>\n\x3Cuse x='271.379437' y='509.95174' xlink:href='#g2-50'/>\n\x3Cuse x='277.107925' y='509.95174' xlink:href='#g2-48'/>\n\x3C/g>\n\x3Cg transform='translate(198.142 305.438)scale(.996264)'>\n\x3Cpath d='M 19.4035 252.523L 107.611 252.523L 107.611 227.321L 19.4035 227.321L 19.4035 252.523Z' fill='#ffffff'/>\n\x3C/g>\n\x3Cg transform='translate(198.142 305.438)scale(.996264)'>\n\x3Cpath d='M 19.4035 252.523L 107.611 252.523L 107.611 227.321L 19.4035 227.321L 19.4035 252.523Z' fill='none' stroke='#333333' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1.00375'/>\n\x3C/g>\n\x3Cuse x='222.489319' y='547.807401' xlink:href='#g3-82'/>\n\x3Cuse x='229.822944' y='547.807401' xlink:href='#g3-51'/>\n\x3Cuse x='234.804283' y='547.807401' xlink:href='#g3-58'/>\n\x3Cg fill='#808080'>\n\x3Cuse x='269.032039' y='546.894154' xlink:href='#g1-102'/>\n\x3Cuse x='272.087236' y='546.894154' xlink:href='#g1-114'/>\n\x3Cuse x='275.778911' y='546.894154' xlink:href='#g1-101'/>\n\x3Cuse x='279.852483' y='546.894154' xlink:href='#g1-101'/>\n\x3C/g>\n\x3Cg transform='translate(198.142 305.438)scale(.996264)'>\n\x3Cpath d='M 158.015 284.026L 284.026 284.026L 284.026 126.512L 158.015 126.512L 158.015 284.026Z' fill='#c0c0ff' opacity='0.2'/>\n\x3C/g>\n\x3Cg transform='translate(198.142 305.438)scale(.996264)'>\n\x3Cpath d='M 158.015 284.026L 284.026 284.026L 284.026 126.512L 158.015 126.512L 158.015 284.026Z' fill='none' stroke='#333333' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1.00375'/>\n\x3C/g>\n\x3Cuse x='382.270815' y='446.462302' xlink:href='#g2-77'/>\n\x3Cuse x='393.146645' y='446.462302' xlink:href='#g2-97'/>\n\x3Cuse x='398.715999' y='446.462302' xlink:href='#g2-105'/>\n\x3Cuse x='401.898492' y='446.462302' xlink:href='#g2-110'/>\n\x3Cuse x='412.08247' y='446.462302' xlink:href='#g2-77'/>\n\x3Cuse x='422.9583' y='446.462302' xlink:href='#g2-101'/>\n\x3Cuse x='428.209423' y='446.462302' xlink:href='#g2-109'/>\n\x3Cuse x='437.756903' y='446.462302' xlink:href='#g2-111'/>\n\x3Cuse x='443.48539' y='446.462302' xlink:href='#g2-114'/>\n\x3Cuse x='448.203795' y='446.462302' xlink:href='#g2-121'/>\n\x3Cg transform='translate(198.142 305.438)scale(.996264)'>\n\x3Cpath d='M 173.766 236.772L 268.274 236.772L 268.274 173.766L 173.766 173.766L 173.766 236.772Z' fill='#ffffff'/>\n\x3C/g>\n\x3Cg transform='translate(198.142 305.438)scale(.996264)'>\n\x3Cpath d='M 173.766 236.772L 268.274 236.772L 268.274 173.766L 173.766 173.766L 173.766 236.772Z' fill='none' stroke='#333333' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1.00375'/>\n\x3C/g>\n\x3Cg fill='#666'>\n\x3Cuse x='392.291009' y='500.093476' xlink:href='#g0-65'/>\n\x3Cuse x='398.633983' y='500.093476' xlink:href='#g0-100'/>\n\x3Cuse x='403.338631' y='500.093476' xlink:href='#g0-100'/>\n\x3Cuse x='408.043278' y='500.093476' xlink:href='#g0-114'/>\n\x3Cuse x='411.343448' y='500.093476' xlink:href='#g0-58'/>\n\x3Cuse x='417.45949' y='500.093476' xlink:href='#g0-48'/>\n\x3Cuse x='421.693673' y='500.093476' xlink:href='#g0-120'/>\n\x3Cuse x='426.163088' y='500.093476' xlink:href='#g0-51'/>\n\x3Cuse x='430.397271' y='500.093476' xlink:href='#g0-70'/>\n\x3Cuse x='435.921082' y='500.093476' xlink:href='#g0-48'/>\n\x3Cuse x='440.155265' y='500.093476' xlink:href='#g0-48'/>\n\x3C/g>\n\x3Cg fill='#009'>\n\x3Cuse x='389.088799' y='518.647707' xlink:href='#g3-86'/>\n\x3Cuse x='395.730568' y='518.647707' xlink:href='#g3-97'/>\n\x3Cuse x='400.711907' y='518.647707' xlink:href='#g3-108'/>\n\x3Cuse x='403.479316' y='518.647707' xlink:href='#g3-117'/>\n\x3Cuse x='409.014132' y='518.647707' xlink:href='#g3-101'/>\n\x3Cuse x='413.441984' y='518.647707' xlink:href='#g3-58'/>\n\x3Cuse x='420.637231' y='518.647707' xlink:href='#g2-51'/>\n\x3Cuse x='426.365719' y='518.647707' xlink:href='#g2-48'/>\n\x3Cuse x='435.415081' y='518.647707' xlink:href='#g3-40'/>\n\x3Cuse x='439.289455' y='518.647707' xlink:href='#g3-99'/>\n\x3Cuse x='443.717307' y='518.647707' xlink:href='#g3-41'/>\n\x3C/g>\n\x3Cg transform='translate(198.142 305.438)scale(.996264)'>\n\x3Cpath d='M 107.758 161.8C 112.654 93.4927 189.212 32.0045 164.316 32.0045' fill='none' stroke='#006600' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1.2'/>\n\x3C/g>\n\x3Cg transform='translate(198.142 305.438)scale(.996264)'>\n\x3Cpath d='M 108.357 161.835C 110.136 159.686 112.68 158.843 112.919 158.857C 113.189 158.873 113.265 159.118 113.252 159.327C 113.233 159.657 113.08 159.708 112.925 159.789C 111.88 160.179 109.638 161.009 108.055 163.921C 107.854 164.27 107.82 164.328 107.611 164.316C 107.401 164.303 107.375 164.242 107.216 163.872C 105.984 160.794 103.854 159.708 102.862 159.199C 102.718 159.1 102.571 159.032 102.591 158.702C 102.603 158.493 102.707 158.258 102.977 158.274C 103.216 158.288 105.644 159.422 107.159 161.765L 108.357 161.835Z' fill='#006600'/>\n\x3C/g>\n\x3Cg transform='translate(198.142 305.438)scale(.996264)'>\n\x3Cpath d='M 108.133 199.654C 127.642 109.686 189.29 50.9061 164.316 50.9061' fill='none' stroke='#006600' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1.2'/>\n\x3C/g>\n\x3Cg transform='translate(198.142 305.438)scale(.996264)'>\n\x3Cpath d='M 108.72 199.778C 110.801 197.919 113.442 197.466 113.677 197.516C 113.941 197.572 113.979 197.826 113.936 198.031C 113.867 198.354 113.708 198.381 113.543 198.438C 112.451 198.667 110.11 199.152 108.109 201.795C 107.858 202.11 107.816 202.162 107.611 202.119C 107.405 202.075 107.389 202.01 107.287 201.621C 106.529 198.394 104.586 197.001 103.681 196.349C 103.553 196.23 103.419 196.14 103.487 195.817C 103.531 195.612 103.669 195.396 103.933 195.452C 104.168 195.501 106.398 196.986 107.546 199.529L 108.72 199.778Z' fill='#006600'/>\n\x3C/g>\n\x3Cg transform='translate(198.142 305.438)scale(.996264)'>\n\x3Cpath d='M 221.031 171.246C 221.686 94.4712 251.778 69.8077 183.217 69.8077' fill='none' stroke='#000099' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1.2'/>\n\x3C/g>\n\x3Cg transform='translate(198.142 305.438)scale(.996264)'>\n\x3Cpath d='M 221.631 171.249C 223.291 169.006 225.785 168.027 226.025 168.028C 226.295 168.029 226.384 168.269 226.383 168.479C 226.382 168.809 226.231 168.869 226.081 168.958C 225.059 169.404 222.865 170.354 221.442 173.348C 221.261 173.707 221.23 173.767 221.02 173.766C 220.81 173.766 220.781 173.705 220.602 173.345C 219.205 170.339 217.019 169.369 216.001 168.915C 215.851 168.824 215.702 168.764 215.703 168.434C 215.704 168.224 215.795 167.984 216.065 167.985C 216.305 167.986 218.791 168.987 220.431 171.244L 221.631 171.249Z' fill='#000099'/>\n\x3C/g>\n\x3C/g>\n\x3C/svg>",type:"svgGraphic"},uuid:"5|10"},$R[710]={content:$R[711]={type:"header",text:"Generating Assembly"},uuid:"5|11"},$R[712]={content:$R[713]={type:"text",text:"The final output is a sequence of assembly instructions. Each instruction corresponds to a basic operation the CPU can perform. Let's look at how a simple line of intermediate code might be translated."},uuid:"5|12"},$R[714]={content:$R[715]={type:"code",markdown:"```\n// Intermediate Code:\n// t1 = a + b\n\n// Generated Assembly Code:\nLOAD R1, a // Load the value of variable 'a' into register R1\nLOAD R2, b // Load the value of variable 'b' into register R2\nADD R1, R1, R2 // Add contents of R1 and R2, store result in R1\nSTORE t1, R1 // Store the result from R1 into memory for 't1'\n```"},uuid:"5|13"},$R[716]={content:$R[717]={type:"text",text:"This assembly code is a low-level, step-by-step guide for the processor. It's much more detailed than our original high-level code but is a direct representation of the operations the CPU will perform."},uuid:"5|14"},$R[718]={content:$R[719]={type:"header",text:"The Challenge of Diversity"},uuid:"5|15"},$R[720]={content:$R[721]={type:"text",text:"A major challenge in code generation is handling different target architectures. The instructions and registers available on an Intel x86 processor are different from those on an ARM processor found in most smartphones. This is why you need different compilers (or different versions of a compiler) for different systems.\n\nA well-designed compiler separates the machine-independent parts (like parsing and type-checking) from the machine-dependent code generator. This allows the bulk of the compiler to be reused, with only the code generation phase needing to be re-written for each new target architecture. This modular design is a cornerstone of modern compiler engineering."},uuid:"5|16"},$R[722]={content:$R[723]={type:"text",text:"To recap the concepts from this section, review these flashcards."},uuid:"5|17"},$R[724]={content:$R[725]={type:"text",text:"Now, let's test your understanding of the final phase of compilation."},uuid:"5|18"},$R[726]={content:$R[727]={type:"quiz",questions:$R[728]=[$R[729]={text:"What is the primary output of the code generation phase in a typical compiler?",options:$R[730]=[$R[731]={text:"An abstract syntax tree",followup:"Incorrect. The abstract syntax tree is created much earlier in the compilation process, during the parsing phase.",isRightAnswer:!1},$R[732]={text:"Assembly language code",followup:"Correct. The code generator translates the intermediate representation into a low-level language like assembly, which is then converted into machine code by an assembler.",isRightAnswer:!0},$R[733]={text:"Binary machine code",followup:"Incorrect. While this is the ultimate goal, the code generator typically produces assembly code, which a separate tool called an assembler converts into binary machine code.",isRightAnswer:!1},$R[734]={text:"Optimized intermediate code",followup:"Incorrect. The optimized intermediate code is the input to the code generator, not its output.",isRightAnswer:!1}]},$R[735]={text:"A compiler is being designed for a new CPU with a very limited number of registers. Which sub-task of code generation will be most critically impacted by this constraint?",options:$R[736]=[$R[737]={text:"Lexical Analysis",followup:"Incorrect. Lexical analysis is part of the compiler's front-end and happens long before code generation.",isRightAnswer:!1},$R[738]={text:"Instruction Selection",followup:"Incorrect. While related, instruction selection is about choosing the best machine instructions. The scarcity of registers is a more direct challenge for register allocation.",isRightAnswer:!1},$R[739]={text:"Register Allocation",followup:"Correct. Register allocation is the process of assigning variables to the limited number of CPU registers. A scarcity of registers makes this task more complex and crucial for performance.",isRightAnswer:!0},$R[740]={text:"Type Checking",followup:"Incorrect. Type checking is a machine-independent task that occurs in the semantic analysis phase.",isRightAnswer:!1}]},$R[741]={text:"The process of moving a variable from a CPU register back to main memory to make room for another variable is known as _______.",options:$R[742]=[$R[743]={text:"swapping",followup:"Incorrect. Swapping typically refers to moving entire processes or pages of memory between RAM and disk storage, a much larger-scale operation.",isRightAnswer:!1},$R[744]={text:"caching",followup:"Incorrect. Caching is a general term for storing data in a faster-access location, but 'spilling' is the specific term for this register allocation action.",isRightAnswer:!1},$R[745]={text:"spilling",followup:"Correct! When all registers are in use, the code generator must 'spill' a variable back to main memory to free up a register.",isRightAnswer:!0},$R[746]={text:"aliasing",followup:"Incorrect. Aliasing refers to a situation where the same memory location can be accessed through different names.",isRightAnswer:!1}]},$R[747]={text:"True or False: The code generation phase of a compiler is largely independent of the target machine's architecture.",options:$R[748]=[$R[749]={text:"True",followup:"Incorrect. The code generator is the most machine-dependent part of the compiler, as it must know the specific instruction set and register layout of the target CPU.",isRightAnswer:!1},$R[750]={text:"False",followup:"Correct. The code generation phase is highly dependent on the target architecture. This is why you need different compilers for different systems (e.g., Intel x86 vs. ARM).",isRightAnswer:!0}]},$R[751]={text:"Why is it beneficial for a compiler to keep frequently used variables in CPU registers instead of main memory (RAM)?",options:$R[752]=[$R[753]={text:"Registers provide more storage space than main memory.",followup:"Incorrect. Registers offer a very small amount of storage compared to main memory.",isRightAnswer:!1},$R[754]={text:"Data stored in registers is automatically saved when the power is turned off.",followup:"Incorrect. Registers are volatile memory, just like RAM. Their contents are lost when power is removed.",isRightAnswer:!1},$R[755]={text:"Accessing data from registers is significantly faster than from RAM.",followup:"Correct. CPU registers are extremely fast, so keeping data there avoids the slower process of fetching it from main memory, which greatly improves program speed.",isRightAnswer:!0}]}]},uuid:"5|19"},$R[756]={content:$R[757]={type:"text",text:"From source code to executable binary, the compilation journey is a multi-stage process of translation and refinement. Code generation is the crucial final step, turning abstract logic into concrete instructions that bring our software to life."},uuid:"5|20"}]},$R[758]={uuid:"6",title:"Error Handling and Symbol Tables",includesKnowledgeBase:!1,hasDemonstratedMastery:!1,streaming:!1,blocks:$R[759]=[$R[760]={content:$R[761]={type:"header",text:"Handling Errors and Keeping Track"},uuid:"6|0"},$R[762]={content:$R[763]={type:"text",text:"Even the best programmers make mistakes. A good compiler acts like a helpful editor, catching errors before the code is ever run. It can't just stop at the first typo; its job is to find as many mistakes as possible in one pass to save the programmer time. These errors fall into three main categories, which follow the phases of compilation we've already discussed."},uuid:"6|1"},$R[764]={content:$R[765]={type:"blockquote",text:"A compiler's most important job, aside from generating correct code, is providing clear and helpful feedback when things go wrong."},uuid:"6|2"},$R[766]={content:$R[767]={type:"text",text:"**Lexical Errors**: These happen when the compiler can't recognize a token. Imagine the lexical analyzer scanning the code and finding a character that doesn't belong, like `int #age = 30;`. The `#` symbol isn't part of a valid number, operator, or identifier in most languages, so the analyzer flags a lexical error.\n\n**Syntax Errors**: These are grammar mistakes. The code doesn't follow the rules of the language's structure. A classic example is a missing semicolon at the end of a statement or mismatched parentheses, like `if (x > 5 { ... }`. The parser, which builds the parse tree, will detect that the structure is incorrect.\n\n**Semantic Errors**: These errors occur when the code is grammatically correct but doesn't make logical sense. For instance, trying to add a string to an integer (`'hello' + 5`) or using a variable that hasn't been declared are semantic errors. The semantic analysis phase, which checks for meaning, catches these issues."},uuid:"6|3"},$R[768]={content:$R[769]={type:"header",text:"Error Recovery"},uuid:"6|4"},$R[770]={content:$R[771]={type:"text",text:"When a compiler finds an error, it needs a strategy to move on and find more potential errors. Simply halting is not very useful. Instead, compilers use recovery techniques to get back on track."},uuid:"6|5"},$R[772]={content:$R[773]={type:"blockquote",text:"Error recovery is the process of adjusting the parser to continue analyzing the rest of the program after an error has been detected."},uuid:"6|6"},$R[774]={content:$R[775]={type:"text",text:"One common method is **panic-mode recovery**. When the parser finds an error, it starts discarding tokens one by one until it finds a synchronizing token, such as a semicolon (`;`) or a closing brace (`}`). This allows it to skip the malformed section and resume parsing from a point where the structure is likely correct again.\n\nAnother approach is **phrase-level recovery**. The parser might try to make a local correction to the source code. For example, it might replace a comma with a semicolon or insert a missing parenthesis to repair the error before continuing.\n\nFinally, some compilers use **error productions**. The language grammar is augmented with special rules that explicitly match common mistakes. For instance, a grammar might have a rule to handle writing `while (c) do { ... }` instead of the correct `while (c) { ... }`, allowing the parser to recognize the error and report it gracefully."},uuid:"6|7"},$R[776]={content:$R[777]={type:"realImage",url:"https://oboe-storage.s3.amazonaws.com/dev/imagesReal/v1/a7af904d-b40c-4634-acc0-4d2637a57b3f.png",attributionUrl:"https://commons.wikimedia.org/wiki/File:Misra_EMC_Error_Analysis_Chart.png",caption:"Compilers perform a kind of error analysis to pinpoint where and why a program fails."},uuid:"6|8"},$R[778]={content:$R[779]={type:"header",text:"The Compiler's Address Book"},uuid:"6|9"},$R[780]={content:$R[781]={type:"text",text:"As a compiler processes code, it needs to remember information about every variable, function, and type it encounters. Where does it store all this data? In a data structure called a **symbol table**.\n\nThink of it like a detailed address book for your code. For every identifier (a variable name, for example), the symbol table stores key details: its type (integer, string, etc.), its scope (where in the program it's accessible), and its memory location. This table is essential for all phases of compilation."},uuid:"6|10"},$R[782]={content:$R[783]={type:"text",text:"During lexical analysis, new identifiers are added to the table. During syntax and semantic analysis, the compiler constantly looks up information in the table to perform checks, like ensuring a variable is declared before it's used (scope resolution) and that you're not trying to assign a string to an integer variable (type checking). Finally, during code generation, the table provides the memory addresses needed to create the final machine code."},uuid:"6|11"},$R[784]={content:$R[785]={type:"table",markdown:"| Name | Type | Scope | Memory Location |\n|-----------|----------|---------|-----------------|\n| `count` | `int` | global | 0x100A |\n| `process` | `func` | global | 0x2050 |\n| `i` | `int` | for loop| 0x100E |\n| `isValid` | `bool` | local | 0x1012 |"},uuid:"6|12"},$R[786]={content:$R[787]={type:"text",text:"Managing the symbol table, especially with nested scopes like loops inside functions, is a critical task. Compilers often use a stack of tables or a single table with scope information to handle this complexity. A well-managed symbol table is the backbone of a robust compiler, enabling it to catch errors and correctly translate the program."},uuid:"6|13"},$R[788]={content:$R[789]={type:"quiz",questions:$R[790]=[$R[791]={text:"A programmer writes the code `int #count = 10;`. Which type of error will the compiler most likely report first?",options:$R[792]=[$R[793]={text:"Semantic Error",followup:"A semantic error occurs when code is grammatically correct but logically meaningless, like adding a string to an integer. This error happens before that stage.",isRightAnswer:!1},$R[794]={text:"Syntax Error",followup:"A syntax error relates to incorrect grammar, like a missing parenthesis. The issue here is the `#` symbol, which the compiler's lexical analyzer won't recognize as part of a valid variable name.",isRightAnswer:!1},$R[795]={text:"Lexical Error",followup:"Correct. The character `#` is not a valid part of an identifier in most programming languages, so the lexical analyzer cannot form a valid token.",isRightAnswer:!0}]},$R[796]={text:"Consider the following C code: `if (x > 5 { printf(\"Value is large\"); }`. What kind of error does it contain?",options:$R[797]=[$R[798]={text:"A semantic error, because the logic is incomplete.",followup:"The error isn't about logic or meaning, but about the fundamental structure or grammar of the `if` statement.",isRightAnswer:!1},$R[799]={text:"A lexical error, because a token is invalid.",followup:"All the individual tokens (`if`, `(`, `x`, `>`, `5`, etc.) are valid. The problem is how they are arranged.",isRightAnswer:!1},$R[800]={text:"A syntax error, because a closing parenthesis is missing.",followup:"Correct. This is a grammatical mistake. The rules of the C language require the condition of an `if` statement to be enclosed in matching parentheses.",isRightAnswer:!0}]},$R[801]={text:"The code `int result = \"hello\" + 5;` is grammatically correct but logically meaningless in most languages. This is an example of a semantic error.",options:$R[802]=[$R[803]={text:"True",followup:"Correct. The syntax follows the pattern `type variable = value;`, but the meaning is flawed because you cannot mathematically add a string and an integer.",isRightAnswer:!0},$R[804]={text:"False",followup:"Incorrect. This is the definition of a semantic error. The structure is valid, but the operation is nonsensical for the given types.",isRightAnswer:!1}]},$R[805]={text:"When a compiler discards tokens after an error until it finds a stable point like a semicolon (`;`) or closing brace (`}`), what recovery strategy is it using?",options:$R[806]=[$R[807]={text:"Scope resolution",followup:"Scope resolution is a task performed using the symbol table to determine which variable an identifier refers to, not an error recovery technique.",isRightAnswer:!1},$R[808]={text:"Phrase-level recovery",followup:"Phrase-level recovery is more localized; it would try to repair the error by, for example, inserting a missing semicolon rather than discarding tokens.",isRightAnswer:!1},$R[809]={text:"Panic-mode recovery",followup:"Correct. This strategy involves skipping a portion of the input to find a synchronizing token where parsing can safely resume.",isRightAnswer:!0},$R[810]={text:"Error production",followup:"Error productions involve adding rules to the grammar to anticipate common mistakes, which is a different approach than skipping input.",isRightAnswer:!1}]},$R[811]={text:"What is the primary data structure a compiler uses to store information about identifiers like variables and functions, including their type, scope, and memory location?",options:$R[812]=[$R[813]={text:"Token stream",followup:"The token stream is the sequence of tokens produced by the lexical analyzer; it's the input for the parser, not a storage for metadata.",isRightAnswer:!1},$R[814]={text:"Activation record",followup:"An activation record (or stack frame) is used at runtime to manage function calls, not during compilation to track identifier metadata.",isRightAnswer:!1},$R[815]={text:"Parse tree",followup:"The parse tree represents the syntactic structure of the code, but it doesn't store the metadata about identifiers.",isRightAnswer:!1},$R[816]={text:"Symbol table",followup:"Correct. The symbol table acts like a dictionary or address book for all identifiers encountered in the code.",isRightAnswer:!0}]}]},uuid:"6|14"}]},$R[817]={uuid:"7",title:"Compiler Construction Tools and Case Studies",includesKnowledgeBase:!1,hasDemonstratedMastery:!1,streaming:!1,blocks:$R[818]=[$R[819]={content:$R[820]={type:"header",text:"Tools of the Trade"},uuid:"7|0"},$R[821]={content:$R[822]={type:"text",text:"Building a compiler from the ground up is a massive undertaking. As you've seen, each phase, from lexical analysis to code generation, is complex. Fortunately, programmers don't have to start from scratch. There are powerful tools, often called compiler-compilers, that automate parts of the process."},uuid:"7|1"},$R[823]={content:$R[824]={type:"text",text:"Two of the most classic and influential tools are Lex and Yacc. They are designed to handle the first two phases of compilation: lexical and syntax analysis."},uuid:"7|2"},$R[825]={content:$R[826]={type:"blockquote",text:"**Lex** handles lexical analysis. You provide it with a set of regular expressions that define the tokens of your language, and it generates a C function—a lexical analyzer—that can scan source code and produce a stream of tokens."},uuid:"7|3"},$R[827]={content:$R[828]={type:"blockquote",text:"**Yacc** (Yet Another Compiler-Compiler) handles syntax analysis. You give it a context-free grammar that describes your language's syntax, and it generates a C function—a parser—that can check if a stream of tokens is grammatically correct."},uuid:"7|4"},$R[829]={content:$R[830]={type:"text",text:"These tools work as a team. The lexical analyzer generated by Lex feeds tokens to the parser generated by Yacc. This combination dramatically simplifies the creation of the compiler's front end, letting developers focus on the more complex semantics and code generation phases."},uuid:"7|5"},$R[831]={content:$R[832]={type:"header",text:"A Tale of Two Compilers"},uuid:"7|7"},$R[833]={content:$R[834]={type:"text",text:"Beyond the tools that help build them, let's look at two of the most important compilers in use today: GCC and LLVM. Their design philosophies represent different approaches to solving the same problem."},uuid:"7|8"},$R[835]={content:$R[836]={type:"realImage",url:"https://oboe-storage.s3.amazonaws.com/dev/imagesReal/v1/dc36c479-0ae4-4e2a-91f3-11cdbf796f97.png",attributionUrl:"https://commons.wikimedia.org/wiki/File:The_C_Programming_Language.png",caption:"The C language and its compilers, like GCC, form the foundation of countless modern software systems."},uuid:"7|9"},$R[837]={content:$R[838]={type:"text",text:"### GCC: The Veteran\n\nThe GNU Compiler Collection (GCC) has been a cornerstone of open-source software for decades. It started as a compiler for the C language but has grown to support many others, including C++, Fortran, and Ada.\n\nGCC's architecture is largely monolithic. The front end, middle end (optimizer), and back end for a specific target are tightly integrated. While it has internal representations, they were historically designed for GCC's internal use, making it harder for other tools to hook into its compilation pipeline."},uuid:"7|10"},$R[839]={content:$R[840]={type:"text",text:"### LLVM: The Newcomer\n\nLLVM, which originally stood for Low Level Virtual Machine, is a collection of modular and reusable compiler and toolchain technologies. Its design is fundamentally different from GCC's.\n\nThe core of LLVM is its Intermediate Representation (IR). LLVM IR is a well-defined, low-level language that acts as a universal adapter. Different front ends (like Clang for C/C++) translate source code into LLVM IR. Then, a series of independent optimization passes can be run on the IR. Finally, different back ends convert the optimized IR into machine code for various architectures.\n\nThis modularity is LLVM's superpower. It makes it easy to create a compiler for a new language—you only need to write a front end that produces LLVM IR. It also allows tools to easily analyze, transform, and optimize code at the IR level."},uuid:"7|12"},$R[841]={content:$R[842]={type:"header",text:"Design Matters"},uuid:"7|14"},$R[843]={content:$R[844]={type:"text",text:"The architectural differences between GCC and LLVM have practical consequences. GCC's monolithic nature makes it a stable, highly-optimized compiler for a well-established set of languages. LLVM's modular, library-based design makes it a flexible foundation for a wide ecosystem of tools, including new programming languages, static analyzers, and just-in-time (JIT) compilers."},uuid:"7|15"},$R[845]={content:$R[846]={type:"table",markdown:"| Feature | GCC (GNU Compiler Collection) | LLVM (Low Level Virtual Machine) |\n|---|---|---|\n| **Architecture** | Monolithic, tightly integrated | Modular, library-based |\n| **Intermediate Rep.** | Internal (GIMPLE) | Standardized (LLVM IR) |\n| **Primary Strength** | Mature, robust, broad platform support | Flexible, reusable, great for new languages & tools |\n| **License** | GPL (requires derived works to be open) | Permissive (allows use in proprietary software) |"},uuid:"7|16"},$R[847]={content:$R[848]={type:"text",text:"Studying these tools and compilers shows the principles of compiler design in action. They demonstrate how theoretical concepts like regular expressions and context-free grammars are applied to build the software that powers almost every digital device we use."},uuid:"7|17"},$R[849]={content:$R[850]={type:"text",text:"Time to check your understanding of these compiler construction concepts."},uuid:"7|18"},$R[851]={content:$R[852]={type:"quiz",questions:$R[853]=[$R[854]={text:"Lex and Yacc are classic tools often called compiler-compilers. Which two phases of the compilation process do they primarily help automate?",options:$R[855]=[$R[856]={text:"Semantic Analysis and Intermediate Code Generation",followup:"Incorrect. While these are important phases, Lex and Yacc handle the earlier stages of parsing the source code text.",isRightAnswer:!1},$R[857]={text:"Code Optimization and Code Generation",followup:"Incorrect. These phases happen much later in the pipeline, after the code's structure and meaning have been established.",isRightAnswer:!1},$R[858]={text:"Preprocessing and Linking",followup:"Incorrect. Preprocessing happens before the main compilation phases, and linking happens after.",isRightAnswer:!1},$R[859]={text:"Lexical Analysis and Syntax Analysis",followup:"Correct. Lex generates a lexical analyzer (scanner) to create tokens, and Yacc generates a syntax analyzer (parser) to check the grammar.",isRightAnswer:!0}]},$R[860]={text:"What is the core component of the LLVM architecture that enables its modularity and acts as a \"universal adapter\" between front ends and back ends?",options:$R[861]=[$R[862]={text:"The LLVM Intermediate Representation (IR)",followup:"Correct. The LLVM IR is the common language that all front ends compile to and all back ends compile from, allowing different components to be mixed and matched.",isRightAnswer:!0},$R[863]={text:"Its collection of optimization passes",followup:"Incorrect. The optimization passes are a key feature, but they operate *on* the core component, which is the IR.",isRightAnswer:!1},$R[864]={text:"The Clang Front End",followup:"Incorrect. Clang is a popular front end that *uses* the LLVM infrastructure, but it is not the core component that enables modularity for all languages.",isRightAnswer:!1}]},$R[865]={text:"Which term best describes the traditional architecture of the GNU Compiler Collection (GCC), where the front end, optimizer, and back end are tightly integrated?",options:$R[866]=[$R[867]={text:"Library-based",followup:"Incorrect. LLVM is designed as a collection of libraries, whereas GCC is a more integrated program.",isRightAnswer:!1},$R[868]={text:"Monolithic",followup:"Correct. GCC's architecture is often described as monolithic because its major components are tightly coupled.",isRightAnswer:!0},$R[869]={text:"Modular",followup:"Incorrect. This term better describes LLVM, which is designed as a collection of reusable libraries.",isRightAnswer:!1},$R[870]={text:"Microkernel",followup:"Incorrect. This is a term used to describe operating system architectures.",isRightAnswer:!1}]},$R[871]={text:"A developer is creating a brand new programming language and wants to leverage existing tools for optimization and machine code generation for multiple hardware types. Which compiler infrastructure would be a better choice for this project?",options:$R[872]=[$R[873]={text:"GCC, because its monolithic nature ensures stability.",followup:"Incorrect. While GCC is stable, its architecture makes it more difficult to integrate a new language front end compared to the alternative.",isRightAnswer:!1},$R[874]={text:"LLVM, because its modular design allows for writing just a new front end that targets the common IR.",followup:"Correct. LLVM's superpower is its modularity. By writing a front end that produces LLVM IR, the developer gains access to LLVM's existing optimizers and back ends for many architectures.",isRightAnswer:!0},$R[875]={text:"Lex and Yacc, because they can generate a full compiler automatically.",followup:"Incorrect. Lex and Yacc only handle the front-end tasks of lexical and syntax analysis, not optimization or code generation.",isRightAnswer:!1}]},$R[876]={text:"The primary advantage of LLVM's modular, IR-based design is that it provides a stable, highly-optimized compiler for a small, well-established set of languages.",options:$R[877]=[$R[878]={text:"True",followup:"Incorrect. This statement more accurately describes the strengths of GCC. LLVM's primary advantage is its flexibility and its use as a foundation for a wide ecosystem of tools and new languages.",isRightAnswer:!1},$R[879]={text:"False",followup:"Correct. This description fits GCC better. LLVM's main advantage is its flexibility and modularity, making it an excellent foundation for a wide variety of new languages and development tools.",isRightAnswer:!0}]}]},uuid:"7|19"},$R[880]={content:$R[881]={type:"text",text:"Understanding these real-world examples provides a practical lens through which to view the entire compilation process."},uuid:"7|20"}]}],version:3,formats:$R[882]=["deepdive"],isBookmarked:!1}},ssr:!0},$R[883]={i:"�_web�learn�$searchSlug��learn�compiler-design-essentials-as0sli�",u:1784582009098,s:"success",l:$R[884]={courseData:$R[21]},ssr:!0}],lastMatchId:"�_web�learn�$searchSlug��learn�compiler-design-essentials-as0sli�",dehydratedData:$R[885]={queryStream:$R[886]=($R[887]=(e) => new ReadableStream({ start: (r) => { e.on({ next: (a) => { try { r.enqueue(a); } catch (t) {} }, throw: (a) => { r.error(a); }, return: () => { try { r.close(); } catch (a) {} } }); } }))($R[888]=($R[889]=() => { let e = [], r = [], t = !0, n = !1, a = 0, s = (l, g, S) => { for (S = 0; S < a; S++) r[S] && r[S][g](l); }, i = (l, g, S, d) => { for (g = 0, S = e.length; g < S; g++) d = e[g], !t && g === S - 1 ? l[n ? "return" : "throw"](d) : l.next(d); }, u = (l, g) => (t && (g = a++, r[g] = l), i(l), () => { t && (r[g] = r[a], r[a--] = void 0); }); return { __SEROVAL_STREAM__: !0, on: (l) => u(l), next: (l) => { t && (e.push(l), s(l, "next")); }, throw: (l) => { t && (e.push(l), s(l, "throw"), t = !1, n = !1, r.length = 0); }, return: (l) => { t && (e.push(l), s(l, "return"), t = !1, n = !0, r.length = 0); } }; })()),dehydratedQueryClient:$R[890]={mutations:$R[891]=[],queries:$R[892]=[$R[893]={dehydratedAt:1784582009099,state:$R[894]={data:null,dataUpdateCount:1,dataUpdatedAt:1784582008993,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:"success",fetchStatus:"idle"},queryKey:$R[895]=["currentUser"],queryHash:"[\"currentUser\"]"},$R[896]={dehydratedAt:1784582009099,state:$R[897]={data:null,dataUpdateCount:1,dataUpdatedAt:1784582008993,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:"success",fetchStatus:"idle"},queryKey:$R[898]=["impersonationState"],queryHash:"[\"impersonationState\"]"},$R[899]={dehydratedAt:1784582009099,state:$R[900]={data:$R[21],dataUpdateCount:1,dataUpdatedAt:1784582009098,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:"success",fetchStatus:"idle"},queryKey:$R[901]=["sequence","as0sli"],queryHash:"[\"sequence\",\"as0sli\"]"}]}}})($R["tsr"]);document.currentScript.remove()