Function( Function { head: Destructured( FunctionHeadDestructured { ellipsis: true, identifier: None, arguments: [ FunctionHeadDestructuredArgument { identifier: "config", default: None, }, FunctionHeadDestructuredArgument { identifier: "lib", default: None, }, FunctionHeadDestructuredArgument { identifier: "pkgs", default: None, }, ], }, ), body: With( With { expression: Identifier( Identifier { id: "lib", span: Span { start: Position { line: 3, column: 6, }, end: Position { line: 3, column: 9, }, }, }, ), target: LetIn( LetIn { bindings: [ KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "cfg", span: Span { start: Position { line: 6, column: 3, }, end: Position { line: 6, column: 6, }, }, }, ), ], to: PropertyAccess( PropertyAccess { expression: Identifier( Identifier { id: "config", span: Span { start: Position { line: 6, column: 9, }, end: Position { line: 6, column: 15, }, }, }, ), attribute_path: [ Raw( PartRaw { content: "services", span: Span { start: Position { line: 6, column: 16, }, end: Position { line: 6, column: 24, }, }, }, ), Raw( PartRaw { content: "spamassassin", span: Span { start: Position { line: 6, column: 25, }, end: Position { line: 6, column: 37, }, }, }, ), ], default: None, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "spamassassin-local-cf", span: Span { start: Position { line: 7, column: 3, }, end: Position { line: 7, column: 24, }, }, }, ), ], to: FunctionApplication( FunctionApplication { function: PropertyAccess( PropertyAccess { expression: Identifier( Identifier { id: "pkgs", span: Span { start: Position { line: 7, column: 27, }, end: Position { line: 7, column: 31, }, }, }, ), attribute_path: [ Raw( PartRaw { content: "writeText", span: Span { start: Position { line: 7, column: 32, }, end: Position { line: 7, column: 41, }, }, }, ), ], default: None, }, ), arguments: [ String( String_ { parts: [ Raw( PartRaw { content: "local.cf", span: Span { start: Position { line: 7, column: 43, }, end: Position { line: 7, column: 51, }, }, }, ), ], span: Span { start: Position { line: 7, column: 42, }, end: Position { line: 7, column: 52, }, }, }, ), PropertyAccess( PropertyAccess { expression: Identifier( Identifier { id: "cfg", span: Span { start: Position { line: 7, column: 53, }, end: Position { line: 7, column: 56, }, }, }, ), attribute_path: [ Raw( PartRaw { content: "config", span: Span { start: Position { line: 7, column: 57, }, end: Position { line: 7, column: 63, }, }, }, ), ], default: None, }, ), ], }, ), }, ), ], target: Map( Map { recursive: false, bindings: [ KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "options", span: Span { start: Position { line: 12, column: 3, }, end: Position { line: 12, column: 10, }, }, }, ), ], to: Map( Map { recursive: false, bindings: [ KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "services", span: Span { start: Position { line: 14, column: 5, }, end: Position { line: 14, column: 13, }, }, }, ), Raw( PartRaw { content: "spamassassin", span: Span { start: Position { line: 14, column: 14, }, end: Position { line: 14, column: 26, }, }, }, ), ], to: Map( Map { recursive: false, bindings: [ KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "enable", span: Span { start: Position { line: 15, column: 7, }, end: Position { line: 15, column: 13, }, }, }, ), ], to: FunctionApplication( FunctionApplication { function: Identifier( Identifier { id: "mkEnableOption", span: Span { start: Position { line: 15, column: 16, }, end: Position { line: 15, column: 30, }, }, }, ), arguments: [ FunctionApplication( FunctionApplication { function: PropertyAccess( PropertyAccess { expression: Identifier( Identifier { id: "lib", span: Span { start: Position { line: 15, column: 32, }, end: Position { line: 15, column: 35, }, }, }, ), attribute_path: [ Raw( PartRaw { content: "mdDoc", span: Span { start: Position { line: 15, column: 36, }, end: Position { line: 15, column: 41, }, }, }, ), ], default: None, }, ), arguments: [ String( String_ { parts: [ Raw( PartRaw { content: "the SpamAssassin daemon", span: Span { start: Position { line: 15, column: 43, }, end: Position { line: 15, column: 66, }, }, }, ), ], span: Span { start: Position { line: 15, column: 42, }, end: Position { line: 15, column: 67, }, }, }, ), ], }, ), ], }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "debug", span: Span { start: Position { line: 17, column: 7, }, end: Position { line: 17, column: 12, }, }, }, ), ], to: FunctionApplication( FunctionApplication { function: Identifier( Identifier { id: "mkOption", span: Span { start: Position { line: 17, column: 15, }, end: Position { line: 17, column: 23, }, }, }, ), arguments: [ Map( Map { recursive: false, bindings: [ KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "type", span: Span { start: Position { line: 18, column: 9, }, end: Position { line: 18, column: 13, }, }, }, ), ], to: PropertyAccess( PropertyAccess { expression: Identifier( Identifier { id: "types", span: Span { start: Position { line: 18, column: 16, }, end: Position { line: 18, column: 21, }, }, }, ), attribute_path: [ Raw( PartRaw { content: "bool", span: Span { start: Position { line: 18, column: 22, }, end: Position { line: 18, column: 26, }, }, }, ), ], default: None, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "default", span: Span { start: Position { line: 19, column: 9, }, end: Position { line: 19, column: 16, }, }, }, ), ], to: Identifier( Identifier { id: "false", span: Span { start: Position { line: 19, column: 19, }, end: Position { line: 19, column: 24, }, }, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "description", span: Span { start: Position { line: 20, column: 9, }, end: Position { line: 20, column: 20, }, }, }, ), ], to: FunctionApplication( FunctionApplication { function: PropertyAccess( PropertyAccess { expression: Identifier( Identifier { id: "lib", span: Span { start: Position { line: 20, column: 23, }, end: Position { line: 20, column: 26, }, }, }, ), attribute_path: [ Raw( PartRaw { content: "mdDoc", span: Span { start: Position { line: 20, column: 27, }, end: Position { line: 20, column: 32, }, }, }, ), ], default: None, }, ), arguments: [ String( String_ { parts: [ Raw( PartRaw { content: "Whether to run the SpamAssassin daemon in debug mode", span: Span { start: Position { line: 20, column: 34, }, end: Position { line: 20, column: 86, }, }, }, ), ], span: Span { start: Position { line: 20, column: 33, }, end: Position { line: 20, column: 87, }, }, }, ), ], }, ), }, ), ], span: Span { start: Position { line: 17, column: 24, }, end: Position { line: 21, column: 8, }, }, }, ), ], }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "config", span: Span { start: Position { line: 23, column: 7, }, end: Position { line: 23, column: 13, }, }, }, ), ], to: FunctionApplication( FunctionApplication { function: Identifier( Identifier { id: "mkOption", span: Span { start: Position { line: 23, column: 16, }, end: Position { line: 23, column: 24, }, }, }, ), arguments: [ Map( Map { recursive: false, bindings: [ KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "type", span: Span { start: Position { line: 24, column: 9, }, end: Position { line: 24, column: 13, }, }, }, ), ], to: PropertyAccess( PropertyAccess { expression: Identifier( Identifier { id: "types", span: Span { start: Position { line: 24, column: 16, }, end: Position { line: 24, column: 21, }, }, }, ), attribute_path: [ Raw( PartRaw { content: "lines", span: Span { start: Position { line: 24, column: 22, }, end: Position { line: 24, column: 27, }, }, }, ), ], default: None, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "description", span: Span { start: Position { line: 25, column: 9, }, end: Position { line: 25, column: 20, }, }, }, ), ], to: FunctionApplication( FunctionApplication { function: PropertyAccess( PropertyAccess { expression: Identifier( Identifier { id: "lib", span: Span { start: Position { line: 25, column: 23, }, end: Position { line: 25, column: 26, }, }, }, ), attribute_path: [ Raw( PartRaw { content: "mdDoc", span: Span { start: Position { line: 25, column: 27, }, end: Position { line: 25, column: 32, }, }, }, ), ], default: None, }, ), arguments: [ IndentedString( IndentedString { parts: [ Raw( PartRaw { content: "The SpamAssassin local.cf config\n\nIf you are using this configuration:\n\n add_header all Status _YESNO_, score=_SCORE_ required=_REQD_ tests=_TESTS_ autolearn=_AUTOLEARN_ version=_VERSION_\n\nThen you can Use this sieve filter:\n\n require [\"fileinto\", \"reject\", \"envelope\"];\n\n if header :contains \"X-Spam-Flag\" \"YES\" {\n fileinto \"spam\";\n }\n\nOr this procmail filter:\n\n :0:\n * ^X-Spam-Flag: YES\n /var/vpopmail/domains/lastlog.de/js/.maildir/.spam/new\n\nTo filter your messages based on the additional mail headers added by spamassassin.\n", span: Span { start: Position { line: 26, column: 1, }, end: Position { line: 47, column: 9, }, }, }, ), ], span: Span { start: Position { line: 25, column: 33, }, end: Position { line: 47, column: 11, }, }, }, ), ], }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "example", span: Span { start: Position { line: 48, column: 9, }, end: Position { line: 48, column: 16, }, }, }, ), ], to: IndentedString( IndentedString { parts: [ Raw( PartRaw { content: "#rewrite_header Subject [***** SPAM _SCORE_ *****]\nrequired_score 5.0\nuse_bayes 1\nbayes_auto_learn 1\nadd_header all Status _YESNO_, score=_SCORE_ required=_REQD_ tests=_TESTS_ autolearn=_AUTOLEARN_ version=_VERSION_\n", span: Span { start: Position { line: 49, column: 1, }, end: Position { line: 54, column: 9, }, }, }, ), ], span: Span { start: Position { line: 48, column: 19, }, end: Position { line: 54, column: 11, }, }, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "default", span: Span { start: Position { line: 55, column: 9, }, end: Position { line: 55, column: 16, }, }, }, ), ], to: String( String_ { parts: [], span: Span { start: Position { line: 55, column: 19, }, end: Position { line: 55, column: 21, }, }, }, ), }, ), ], span: Span { start: Position { line: 23, column: 25, }, end: Position { line: 56, column: 8, }, }, }, ), ], }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "initPreConf", span: Span { start: Position { line: 58, column: 7, }, end: Position { line: 58, column: 18, }, }, }, ), ], to: FunctionApplication( FunctionApplication { function: Identifier( Identifier { id: "mkOption", span: Span { start: Position { line: 58, column: 21, }, end: Position { line: 58, column: 29, }, }, }, ), arguments: [ Map( Map { recursive: false, bindings: [ KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "type", span: Span { start: Position { line: 59, column: 9, }, end: Position { line: 59, column: 13, }, }, }, ), ], to: With( With { expression: Identifier( Identifier { id: "types", span: Span { start: Position { line: 59, column: 21, }, end: Position { line: 59, column: 26, }, }, }, ), target: FunctionApplication( FunctionApplication { function: Identifier( Identifier { id: "either", span: Span { start: Position { line: 59, column: 28, }, end: Position { line: 59, column: 34, }, }, }, ), arguments: [ Identifier( Identifier { id: "str", span: Span { start: Position { line: 59, column: 35, }, end: Position { line: 59, column: 38, }, }, }, ), Identifier( Identifier { id: "path", span: Span { start: Position { line: 59, column: 39, }, end: Position { line: 59, column: 43, }, }, }, ), ], }, ), span: Span { start: Position { line: 59, column: 16, }, end: Position { line: 59, column: 43, }, }, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "description", span: Span { start: Position { line: 60, column: 9, }, end: Position { line: 60, column: 20, }, }, }, ), ], to: FunctionApplication( FunctionApplication { function: PropertyAccess( PropertyAccess { expression: Identifier( Identifier { id: "lib", span: Span { start: Position { line: 60, column: 23, }, end: Position { line: 60, column: 26, }, }, }, ), attribute_path: [ Raw( PartRaw { content: "mdDoc", span: Span { start: Position { line: 60, column: 27, }, end: Position { line: 60, column: 32, }, }, }, ), ], default: None, }, ), arguments: [ String( String_ { parts: [ Raw( PartRaw { content: "The SpamAssassin init.pre config.", span: Span { start: Position { line: 60, column: 34, }, end: Position { line: 60, column: 67, }, }, }, ), ], span: Span { start: Position { line: 60, column: 33, }, end: Position { line: 60, column: 68, }, }, }, ), ], }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "apply", span: Span { start: Position { line: 61, column: 9, }, end: Position { line: 61, column: 14, }, }, }, ), ], to: Function( Function { head: Simple( FunctionHeadSimple { identifier: "val", }, ), body: IfThenElse( IfThenElse { predicate: FunctionApplication( FunctionApplication { function: PropertyAccess( PropertyAccess { expression: Identifier( Identifier { id: "builtins", span: Span { start: Position { line: 61, column: 25, }, end: Position { line: 61, column: 33, }, }, }, ), attribute_path: [ Raw( PartRaw { content: "isPath", span: Span { start: Position { line: 61, column: 34, }, end: Position { line: 61, column: 40, }, }, }, ), ], default: None, }, ), arguments: [ Identifier( Identifier { id: "val", span: Span { start: Position { line: 61, column: 41, }, end: Position { line: 61, column: 44, }, }, }, ), ], }, ), then: Identifier( Identifier { id: "val", span: Span { start: Position { line: 61, column: 50, }, end: Position { line: 61, column: 53, }, }, }, ), else_: FunctionApplication( FunctionApplication { function: PropertyAccess( PropertyAccess { expression: Identifier( Identifier { id: "pkgs", span: Span { start: Position { line: 61, column: 59, }, end: Position { line: 61, column: 63, }, }, }, ), attribute_path: [ Raw( PartRaw { content: "writeText", span: Span { start: Position { line: 61, column: 64, }, end: Position { line: 61, column: 73, }, }, }, ), ], default: None, }, ), arguments: [ String( String_ { parts: [ Raw( PartRaw { content: "init.pre", span: Span { start: Position { line: 61, column: 75, }, end: Position { line: 61, column: 83, }, }, }, ), ], span: Span { start: Position { line: 61, column: 74, }, end: Position { line: 61, column: 84, }, }, }, ), Identifier( Identifier { id: "val", span: Span { start: Position { line: 61, column: 85, }, end: Position { line: 61, column: 88, }, }, }, ), ], }, ), span: Span { start: Position { line: 61, column: 22, }, end: Position { line: 61, column: 88, }, }, }, ), span: Span { start: Position { line: 61, column: 17, }, end: Position { line: 61, column: 88, }, }, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "default", span: Span { start: Position { line: 62, column: 9, }, end: Position { line: 62, column: 16, }, }, }, ), ], to: IndentedString( IndentedString { parts: [ Raw( PartRaw { content: "#\n# to update this list, run this command in the rules directory:\n# grep 'loadplugin.*Mail::SpamAssassin::Plugin::.*' -o -h * | sort | uniq\n#\n\n#loadplugin Mail::SpamAssassin::Plugin::AccessDB\n#loadplugin Mail::SpamAssassin::Plugin::AntiVirus\nloadplugin Mail::SpamAssassin::Plugin::AskDNS\n# loadplugin Mail::SpamAssassin::Plugin::ASN\nloadplugin Mail::SpamAssassin::Plugin::AutoLearnThreshold\n#loadplugin Mail::SpamAssassin::Plugin::AWL\nloadplugin Mail::SpamAssassin::Plugin::Bayes\nloadplugin Mail::SpamAssassin::Plugin::BodyEval\nloadplugin Mail::SpamAssassin::Plugin::Check\n#loadplugin Mail::SpamAssassin::Plugin::DCC\nloadplugin Mail::SpamAssassin::Plugin::DKIM\nloadplugin Mail::SpamAssassin::Plugin::DNSEval\nloadplugin Mail::SpamAssassin::Plugin::FreeMail\nloadplugin Mail::SpamAssassin::Plugin::Hashcash\nloadplugin Mail::SpamAssassin::Plugin::HeaderEval\nloadplugin Mail::SpamAssassin::Plugin::HTMLEval\nloadplugin Mail::SpamAssassin::Plugin::HTTPSMismatch\nloadplugin Mail::SpamAssassin::Plugin::ImageInfo\nloadplugin Mail::SpamAssassin::Plugin::MIMEEval\nloadplugin Mail::SpamAssassin::Plugin::MIMEHeader\n# loadplugin Mail::SpamAssassin::Plugin::PDFInfo\n#loadplugin Mail::SpamAssassin::Plugin::PhishTag\nloadplugin Mail::SpamAssassin::Plugin::Pyzor\nloadplugin Mail::SpamAssassin::Plugin::Razor2\n# loadplugin Mail::SpamAssassin::Plugin::RelayCountry\nloadplugin Mail::SpamAssassin::Plugin::RelayEval\nloadplugin Mail::SpamAssassin::Plugin::ReplaceTags\n# loadplugin Mail::SpamAssassin::Plugin::Rule2XSBody\n# loadplugin Mail::SpamAssassin::Plugin::Shortcircuit\nloadplugin Mail::SpamAssassin::Plugin::SpamCop\nloadplugin Mail::SpamAssassin::Plugin::SPF\n#loadplugin Mail::SpamAssassin::Plugin::TextCat\n# loadplugin Mail::SpamAssassin::Plugin::TxRep\nloadplugin Mail::SpamAssassin::Plugin::URIDetail\nloadplugin Mail::SpamAssassin::Plugin::URIDNSBL\nloadplugin Mail::SpamAssassin::Plugin::URIEval\n# loadplugin Mail::SpamAssassin::Plugin::URILocalBL\nloadplugin Mail::SpamAssassin::Plugin::VBounce\nloadplugin Mail::SpamAssassin::Plugin::WhiteListSubject\nloadplugin Mail::SpamAssassin::Plugin::WLBLEval\n", span: Span { start: Position { line: 64, column: 1, }, end: Position { line: 109, column: 9, }, }, }, ), ], span: Span { start: Position { line: 63, column: 9, }, end: Position { line: 109, column: 11, }, }, }, ), }, ), ], span: Span { start: Position { line: 58, column: 30, }, end: Position { line: 110, column: 8, }, }, }, ), ], }, ), }, ), ], span: Span { start: Position { line: 14, column: 29, }, end: Position { line: 111, column: 6, }, }, }, ), }, ), ], span: Span { start: Position { line: 12, column: 13, }, end: Position { line: 112, column: 4, }, }, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "config", span: Span { start: Position { line: 114, column: 3, }, end: Position { line: 114, column: 9, }, }, }, ), ], to: FunctionApplication( FunctionApplication { function: Identifier( Identifier { id: "mkIf", span: Span { start: Position { line: 114, column: 12, }, end: Position { line: 114, column: 16, }, }, }, ), arguments: [ PropertyAccess( PropertyAccess { expression: Identifier( Identifier { id: "cfg", span: Span { start: Position { line: 114, column: 17, }, end: Position { line: 114, column: 20, }, }, }, ), attribute_path: [ Raw( PartRaw { content: "enable", span: Span { start: Position { line: 114, column: 21, }, end: Position { line: 114, column: 27, }, }, }, ), ], default: None, }, ), Map( Map { recursive: false, bindings: [ KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "environment", span: Span { start: Position { line: 115, column: 5, }, end: Position { line: 115, column: 16, }, }, }, ), Raw( PartRaw { content: "etc", span: Span { start: Position { line: 115, column: 17, }, end: Position { line: 115, column: 20, }, }, }, ), Expression( PartExpression { expression: String( String_ { parts: [ Raw( PartRaw { content: "mail/spamassassin/init.pre", span: Span { start: Position { line: 115, column: 22, }, end: Position { line: 115, column: 48, }, }, }, ), ], span: Span { start: Position { line: 115, column: 21, }, end: Position { line: 115, column: 49, }, }, }, ), }, ), Raw( PartRaw { content: "source", span: Span { start: Position { line: 115, column: 50, }, end: Position { line: 115, column: 56, }, }, }, ), ], to: PropertyAccess( PropertyAccess { expression: Identifier( Identifier { id: "cfg", span: Span { start: Position { line: 115, column: 59, }, end: Position { line: 115, column: 62, }, }, }, ), attribute_path: [ Raw( PartRaw { content: "initPreConf", span: Span { start: Position { line: 115, column: 63, }, end: Position { line: 115, column: 74, }, }, }, ), ], default: None, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "environment", span: Span { start: Position { line: 116, column: 5, }, end: Position { line: 116, column: 16, }, }, }, ), Raw( PartRaw { content: "etc", span: Span { start: Position { line: 116, column: 17, }, end: Position { line: 116, column: 20, }, }, }, ), Expression( PartExpression { expression: String( String_ { parts: [ Raw( PartRaw { content: "mail/spamassassin/local.cf", span: Span { start: Position { line: 116, column: 22, }, end: Position { line: 116, column: 48, }, }, }, ), ], span: Span { start: Position { line: 116, column: 21, }, end: Position { line: 116, column: 49, }, }, }, ), }, ), Raw( PartRaw { content: "source", span: Span { start: Position { line: 116, column: 50, }, end: Position { line: 116, column: 56, }, }, }, ), ], to: Identifier( Identifier { id: "spamassassin-local-cf", span: Span { start: Position { line: 116, column: 59, }, end: Position { line: 116, column: 80, }, }, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "environment", span: Span { start: Position { line: 119, column: 5, }, end: Position { line: 119, column: 16, }, }, }, ), Raw( PartRaw { content: "systemPackages", span: Span { start: Position { line: 119, column: 17, }, end: Position { line: 119, column: 31, }, }, }, ), ], to: List( List { elements: [ PropertyAccess( PropertyAccess { expression: Identifier( Identifier { id: "pkgs", span: Span { start: Position { line: 119, column: 36, }, end: Position { line: 119, column: 40, }, }, }, ), attribute_path: [ Raw( PartRaw { content: "spamassassin", span: Span { start: Position { line: 119, column: 41, }, end: Position { line: 119, column: 53, }, }, }, ), ], default: None, }, ), ], span: Span { start: Position { line: 119, column: 34, }, end: Position { line: 119, column: 55, }, }, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "users", span: Span { start: Position { line: 121, column: 5, }, end: Position { line: 121, column: 10, }, }, }, ), Raw( PartRaw { content: "users", span: Span { start: Position { line: 121, column: 11, }, end: Position { line: 121, column: 16, }, }, }, ), Raw( PartRaw { content: "spamd", span: Span { start: Position { line: 121, column: 17, }, end: Position { line: 121, column: 22, }, }, }, ), ], to: Map( Map { recursive: false, bindings: [ KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "description", span: Span { start: Position { line: 122, column: 7, }, end: Position { line: 122, column: 18, }, }, }, ), ], to: String( String_ { parts: [ Raw( PartRaw { content: "Spam Assassin Daemon", span: Span { start: Position { line: 122, column: 22, }, end: Position { line: 122, column: 42, }, }, }, ), ], span: Span { start: Position { line: 122, column: 21, }, end: Position { line: 122, column: 43, }, }, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "uid", span: Span { start: Position { line: 123, column: 7, }, end: Position { line: 123, column: 10, }, }, }, ), ], to: PropertyAccess( PropertyAccess { expression: Identifier( Identifier { id: "config", span: Span { start: Position { line: 123, column: 13, }, end: Position { line: 123, column: 19, }, }, }, ), attribute_path: [ Raw( PartRaw { content: "ids", span: Span { start: Position { line: 123, column: 20, }, end: Position { line: 123, column: 23, }, }, }, ), Raw( PartRaw { content: "uids", span: Span { start: Position { line: 123, column: 24, }, end: Position { line: 123, column: 28, }, }, }, ), Raw( PartRaw { content: "spamd", span: Span { start: Position { line: 123, column: 29, }, end: Position { line: 123, column: 34, }, }, }, ), ], default: None, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "group", span: Span { start: Position { line: 124, column: 7, }, end: Position { line: 124, column: 12, }, }, }, ), ], to: String( String_ { parts: [ Raw( PartRaw { content: "spamd", span: Span { start: Position { line: 124, column: 16, }, end: Position { line: 124, column: 21, }, }, }, ), ], span: Span { start: Position { line: 124, column: 15, }, end: Position { line: 124, column: 22, }, }, }, ), }, ), ], span: Span { start: Position { line: 121, column: 25, }, end: Position { line: 125, column: 6, }, }, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "users", span: Span { start: Position { line: 127, column: 5, }, end: Position { line: 127, column: 10, }, }, }, ), Raw( PartRaw { content: "groups", span: Span { start: Position { line: 127, column: 11, }, end: Position { line: 127, column: 17, }, }, }, ), Raw( PartRaw { content: "spamd", span: Span { start: Position { line: 127, column: 18, }, end: Position { line: 127, column: 23, }, }, }, ), ], to: Map( Map { recursive: false, bindings: [ KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "gid", span: Span { start: Position { line: 128, column: 7, }, end: Position { line: 128, column: 10, }, }, }, ), ], to: PropertyAccess( PropertyAccess { expression: Identifier( Identifier { id: "config", span: Span { start: Position { line: 128, column: 13, }, end: Position { line: 128, column: 19, }, }, }, ), attribute_path: [ Raw( PartRaw { content: "ids", span: Span { start: Position { line: 128, column: 20, }, end: Position { line: 128, column: 23, }, }, }, ), Raw( PartRaw { content: "gids", span: Span { start: Position { line: 128, column: 24, }, end: Position { line: 128, column: 28, }, }, }, ), Raw( PartRaw { content: "spamd", span: Span { start: Position { line: 128, column: 29, }, end: Position { line: 128, column: 34, }, }, }, ), ], default: None, }, ), }, ), ], span: Span { start: Position { line: 127, column: 26, }, end: Position { line: 129, column: 6, }, }, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "systemd", span: Span { start: Position { line: 131, column: 5, }, end: Position { line: 131, column: 12, }, }, }, ), Raw( PartRaw { content: "services", span: Span { start: Position { line: 131, column: 13, }, end: Position { line: 131, column: 21, }, }, }, ), Raw( PartRaw { content: "sa-update", span: Span { start: Position { line: 131, column: 22, }, end: Position { line: 131, column: 31, }, }, }, ), ], to: Map( Map { recursive: false, bindings: [ KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "wants", span: Span { start: Position { line: 133, column: 7, }, end: Position { line: 133, column: 12, }, }, }, ), ], to: List( List { elements: [ String( String_ { parts: [ Raw( PartRaw { content: "network-online.target", span: Span { start: Position { line: 133, column: 18, }, end: Position { line: 133, column: 39, }, }, }, ), ], span: Span { start: Position { line: 133, column: 17, }, end: Position { line: 133, column: 40, }, }, }, ), ], span: Span { start: Position { line: 133, column: 15, }, end: Position { line: 133, column: 42, }, }, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "after", span: Span { start: Position { line: 134, column: 7, }, end: Position { line: 134, column: 12, }, }, }, ), ], to: List( List { elements: [ String( String_ { parts: [ Raw( PartRaw { content: "network-online.target", span: Span { start: Position { line: 134, column: 18, }, end: Position { line: 134, column: 39, }, }, }, ), ], span: Span { start: Position { line: 134, column: 17, }, end: Position { line: 134, column: 40, }, }, }, ), ], span: Span { start: Position { line: 134, column: 15, }, end: Position { line: 134, column: 42, }, }, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "serviceConfig", span: Span { start: Position { line: 136, column: 7, }, end: Position { line: 136, column: 20, }, }, }, ), ], to: Map( Map { recursive: false, bindings: [ KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "Type", span: Span { start: Position { line: 137, column: 9, }, end: Position { line: 137, column: 13, }, }, }, ), ], to: String( String_ { parts: [ Raw( PartRaw { content: "oneshot", span: Span { start: Position { line: 137, column: 17, }, end: Position { line: 137, column: 24, }, }, }, ), ], span: Span { start: Position { line: 137, column: 16, }, end: Position { line: 137, column: 25, }, }, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "User", span: Span { start: Position { line: 138, column: 9, }, end: Position { line: 138, column: 13, }, }, }, ), ], to: String( String_ { parts: [ Raw( PartRaw { content: "spamd", span: Span { start: Position { line: 138, column: 17, }, end: Position { line: 138, column: 22, }, }, }, ), ], span: Span { start: Position { line: 138, column: 16, }, end: Position { line: 138, column: 23, }, }, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "Group", span: Span { start: Position { line: 139, column: 9, }, end: Position { line: 139, column: 14, }, }, }, ), ], to: String( String_ { parts: [ Raw( PartRaw { content: "spamd", span: Span { start: Position { line: 139, column: 18, }, end: Position { line: 139, column: 23, }, }, }, ), ], span: Span { start: Position { line: 139, column: 17, }, end: Position { line: 139, column: 24, }, }, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "StateDirectory", span: Span { start: Position { line: 140, column: 9, }, end: Position { line: 140, column: 23, }, }, }, ), ], to: String( String_ { parts: [ Raw( PartRaw { content: "spamassassin", span: Span { start: Position { line: 140, column: 27, }, end: Position { line: 140, column: 39, }, }, }, ), ], span: Span { start: Position { line: 140, column: 26, }, end: Position { line: 140, column: 40, }, }, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "ExecStartPost", span: Span { start: Position { line: 141, column: 9, }, end: Position { line: 141, column: 22, }, }, }, ), ], to: String( String_ { parts: [ Raw( PartRaw { content: "+", span: Span { start: Position { line: 141, column: 26, }, end: Position { line: 141, column: 52, }, }, }, ), Interpolation( PartInterpolation { expression: PropertyAccess( PropertyAccess { expression: Identifier( Identifier { id: "config", span: Span { start: Position { line: 141, column: 29, }, end: Position { line: 141, column: 35, }, }, }, ), attribute_path: [ Raw( PartRaw { content: "systemd", span: Span { start: Position { line: 141, column: 36, }, end: Position { line: 141, column: 43, }, }, }, ), Raw( PartRaw { content: "package", span: Span { start: Position { line: 141, column: 44, }, end: Position { line: 141, column: 51, }, }, }, ), ], default: None, }, ), }, ), Raw( PartRaw { content: "/bin/systemctl -q --no-block try-reload-or-restart spamd.service", span: Span { start: Position { line: 141, column: 26, }, end: Position { line: 141, column: 116, }, }, }, ), ], span: Span { start: Position { line: 141, column: 25, }, end: Position { line: 141, column: 117, }, }, }, ), }, ), ], span: Span { start: Position { line: 136, column: 23, }, end: Position { line: 142, column: 8, }, }, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "script", span: Span { start: Position { line: 144, column: 7, }, end: Position { line: 144, column: 13, }, }, }, ), ], to: IndentedString( IndentedString { parts: [ Raw( PartRaw { content: "set +e\n", span: Span { start: Position { line: 145, column: 1, }, end: Position { line: 146, column: 9, }, }, }, ), Interpolation( PartInterpolation { expression: PropertyAccess( PropertyAccess { expression: Identifier( Identifier { id: "pkgs", span: Span { start: Position { line: 146, column: 11, }, end: Position { line: 146, column: 15, }, }, }, ), attribute_path: [ Raw( PartRaw { content: "spamassassin", span: Span { start: Position { line: 146, column: 16, }, end: Position { line: 146, column: 28, }, }, }, ), ], default: None, }, ), }, ), Raw( PartRaw { content: "/bin/sa-update --verbose --gpghomedir=/var/lib/spamassassin/sa-update-keys/\nrc=$?\nset -e\n\nif [[ $rc -gt 1 ]]; then\n # sa-update failed.\n exit $rc\nfi\n\nif [[ $rc -eq 1 ]]; then\n # No update was available, exit successfully.\n exit 0\nfi\n\n# An update was available and installed. Compile the rules.\n", span: Span { start: Position { line: 145, column: 1, }, end: Position { line: 161, column: 9, }, }, }, ), Interpolation( PartInterpolation { expression: PropertyAccess( PropertyAccess { expression: Identifier( Identifier { id: "pkgs", span: Span { start: Position { line: 161, column: 11, }, end: Position { line: 161, column: 15, }, }, }, ), attribute_path: [ Raw( PartRaw { content: "spamassassin", span: Span { start: Position { line: 161, column: 16, }, end: Position { line: 161, column: 28, }, }, }, ), ], default: None, }, ), }, ), Raw( PartRaw { content: "/bin/sa-compile\n", span: Span { start: Position { line: 145, column: 1, }, end: Position { line: 162, column: 7, }, }, }, ), ], span: Span { start: Position { line: 144, column: 16, }, end: Position { line: 162, column: 9, }, }, }, ), }, ), ], span: Span { start: Position { line: 131, column: 34, }, end: Position { line: 163, column: 6, }, }, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "systemd", span: Span { start: Position { line: 165, column: 5, }, end: Position { line: 165, column: 12, }, }, }, ), Raw( PartRaw { content: "timers", span: Span { start: Position { line: 165, column: 13, }, end: Position { line: 165, column: 19, }, }, }, ), Raw( PartRaw { content: "sa-update", span: Span { start: Position { line: 165, column: 20, }, end: Position { line: 165, column: 29, }, }, }, ), ], to: Map( Map { recursive: false, bindings: [ KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "description", span: Span { start: Position { line: 166, column: 7, }, end: Position { line: 166, column: 18, }, }, }, ), ], to: String( String_ { parts: [ Raw( PartRaw { content: "sa-update-service", span: Span { start: Position { line: 166, column: 22, }, end: Position { line: 166, column: 39, }, }, }, ), ], span: Span { start: Position { line: 166, column: 21, }, end: Position { line: 166, column: 40, }, }, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "partOf", span: Span { start: Position { line: 167, column: 7, }, end: Position { line: 167, column: 13, }, }, }, ), ], to: List( List { elements: [ String( String_ { parts: [ Raw( PartRaw { content: "sa-update.service", span: Span { start: Position { line: 167, column: 24, }, end: Position { line: 167, column: 41, }, }, }, ), ], span: Span { start: Position { line: 167, column: 23, }, end: Position { line: 167, column: 42, }, }, }, ), ], span: Span { start: Position { line: 167, column: 21, }, end: Position { line: 167, column: 44, }, }, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "wantedBy", span: Span { start: Position { line: 168, column: 7, }, end: Position { line: 168, column: 15, }, }, }, ), ], to: List( List { elements: [ String( String_ { parts: [ Raw( PartRaw { content: "timers.target", span: Span { start: Position { line: 168, column: 24, }, end: Position { line: 168, column: 37, }, }, }, ), ], span: Span { start: Position { line: 168, column: 23, }, end: Position { line: 168, column: 38, }, }, }, ), ], span: Span { start: Position { line: 168, column: 21, }, end: Position { line: 168, column: 40, }, }, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "timerConfig", span: Span { start: Position { line: 169, column: 7, }, end: Position { line: 169, column: 18, }, }, }, ), ], to: Map( Map { recursive: false, bindings: [ KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "OnCalendar", span: Span { start: Position { line: 170, column: 9, }, end: Position { line: 170, column: 19, }, }, }, ), ], to: String( String_ { parts: [ Raw( PartRaw { content: "1:*", span: Span { start: Position { line: 170, column: 23, }, end: Position { line: 170, column: 26, }, }, }, ), ], span: Span { start: Position { line: 170, column: 22, }, end: Position { line: 170, column: 27, }, }, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "Persistent", span: Span { start: Position { line: 171, column: 9, }, end: Position { line: 171, column: 19, }, }, }, ), ], to: Identifier( Identifier { id: "true", span: Span { start: Position { line: 171, column: 22, }, end: Position { line: 171, column: 26, }, }, }, ), }, ), ], span: Span { start: Position { line: 169, column: 21, }, end: Position { line: 172, column: 8, }, }, }, ), }, ), ], span: Span { start: Position { line: 165, column: 32, }, end: Position { line: 173, column: 6, }, }, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "systemd", span: Span { start: Position { line: 175, column: 5, }, end: Position { line: 175, column: 12, }, }, }, ), Raw( PartRaw { content: "services", span: Span { start: Position { line: 175, column: 13, }, end: Position { line: 175, column: 21, }, }, }, ), Raw( PartRaw { content: "spamd", span: Span { start: Position { line: 175, column: 22, }, end: Position { line: 175, column: 27, }, }, }, ), ], to: Map( Map { recursive: false, bindings: [ KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "description", span: Span { start: Position { line: 176, column: 7, }, end: Position { line: 176, column: 18, }, }, }, ), ], to: String( String_ { parts: [ Raw( PartRaw { content: "SpamAssassin Server", span: Span { start: Position { line: 176, column: 22, }, end: Position { line: 176, column: 41, }, }, }, ), ], span: Span { start: Position { line: 176, column: 21, }, end: Position { line: 176, column: 42, }, }, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "wantedBy", span: Span { start: Position { line: 178, column: 7, }, end: Position { line: 178, column: 15, }, }, }, ), ], to: List( List { elements: [ String( String_ { parts: [ Raw( PartRaw { content: "multi-user.target", span: Span { start: Position { line: 178, column: 21, }, end: Position { line: 178, column: 38, }, }, }, ), ], span: Span { start: Position { line: 178, column: 20, }, end: Position { line: 178, column: 39, }, }, }, ), ], span: Span { start: Position { line: 178, column: 18, }, end: Position { line: 178, column: 41, }, }, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "wants", span: Span { start: Position { line: 179, column: 7, }, end: Position { line: 179, column: 12, }, }, }, ), ], to: List( List { elements: [ String( String_ { parts: [ Raw( PartRaw { content: "sa-update.service", span: Span { start: Position { line: 179, column: 18, }, end: Position { line: 179, column: 35, }, }, }, ), ], span: Span { start: Position { line: 179, column: 17, }, end: Position { line: 179, column: 36, }, }, }, ), ], span: Span { start: Position { line: 179, column: 15, }, end: Position { line: 179, column: 38, }, }, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "after", span: Span { start: Position { line: 180, column: 7, }, end: Position { line: 180, column: 12, }, }, }, ), ], to: List( List { elements: [ String( String_ { parts: [ Raw( PartRaw { content: "network.target", span: Span { start: Position { line: 181, column: 10, }, end: Position { line: 181, column: 24, }, }, }, ), ], span: Span { start: Position { line: 181, column: 9, }, end: Position { line: 181, column: 25, }, }, }, ), String( String_ { parts: [ Raw( PartRaw { content: "sa-update.service", span: Span { start: Position { line: 182, column: 10, }, end: Position { line: 182, column: 27, }, }, }, ), ], span: Span { start: Position { line: 182, column: 9, }, end: Position { line: 182, column: 28, }, }, }, ), ], span: Span { start: Position { line: 180, column: 15, }, end: Position { line: 183, column: 8, }, }, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "serviceConfig", span: Span { start: Position { line: 185, column: 7, }, end: Position { line: 185, column: 20, }, }, }, ), ], to: Map( Map { recursive: false, bindings: [ KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "User", span: Span { start: Position { line: 186, column: 9, }, end: Position { line: 186, column: 13, }, }, }, ), ], to: String( String_ { parts: [ Raw( PartRaw { content: "spamd", span: Span { start: Position { line: 186, column: 17, }, end: Position { line: 186, column: 22, }, }, }, ), ], span: Span { start: Position { line: 186, column: 16, }, end: Position { line: 186, column: 23, }, }, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "Group", span: Span { start: Position { line: 187, column: 9, }, end: Position { line: 187, column: 14, }, }, }, ), ], to: String( String_ { parts: [ Raw( PartRaw { content: "spamd", span: Span { start: Position { line: 187, column: 18, }, end: Position { line: 187, column: 23, }, }, }, ), ], span: Span { start: Position { line: 187, column: 17, }, end: Position { line: 187, column: 24, }, }, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "ExecStart", span: Span { start: Position { line: 188, column: 9, }, end: Position { line: 188, column: 18, }, }, }, ), ], to: String( String_ { parts: [ Raw( PartRaw { content: "+", span: Span { start: Position { line: 188, column: 22, }, end: Position { line: 188, column: 43, }, }, }, ), Interpolation( PartInterpolation { expression: PropertyAccess( PropertyAccess { expression: Identifier( Identifier { id: "pkgs", span: Span { start: Position { line: 188, column: 25, }, end: Position { line: 188, column: 29, }, }, }, ), attribute_path: [ Raw( PartRaw { content: "spamassassin", span: Span { start: Position { line: 188, column: 30, }, end: Position { line: 188, column: 42, }, }, }, ), ], default: None, }, ), }, ), Raw( PartRaw { content: "/bin/spamd ", span: Span { start: Position { line: 188, column: 22, }, end: Position { line: 188, column: 54, }, }, }, ), Interpolation( PartInterpolation { expression: FunctionApplication( FunctionApplication { function: Identifier( Identifier { id: "optionalString", span: Span { start: Position { line: 188, column: 56, }, end: Position { line: 188, column: 70, }, }, }, ), arguments: [ PropertyAccess( PropertyAccess { expression: Identifier( Identifier { id: "cfg", span: Span { start: Position { line: 188, column: 71, }, end: Position { line: 188, column: 74, }, }, }, ), attribute_path: [ Raw( PartRaw { content: "debug", span: Span { start: Position { line: 188, column: 75, }, end: Position { line: 188, column: 80, }, }, }, ), ], default: None, }, ), String( String_ { parts: [ Raw( PartRaw { content: "-D", span: Span { start: Position { line: 188, column: 82, }, end: Position { line: 188, column: 84, }, }, }, ), ], span: Span { start: Position { line: 188, column: 81, }, end: Position { line: 188, column: 85, }, }, }, ), ], }, ), }, ), Raw( PartRaw { content: " --username=spamd --groupname=spamd --virtual-config-dir=%S/spamassassin/user-%u --allow-tell --pidfile=/run/spamd.pid", span: Span { start: Position { line: 188, column: 22, }, end: Position { line: 188, column: 204, }, }, }, ), ], span: Span { start: Position { line: 188, column: 21, }, end: Position { line: 188, column: 205, }, }, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "ExecReload", span: Span { start: Position { line: 189, column: 9, }, end: Position { line: 189, column: 19, }, }, }, ), ], to: String( String_ { parts: [ Raw( PartRaw { content: "+", span: Span { start: Position { line: 189, column: 23, }, end: Position { line: 189, column: 41, }, }, }, ), Interpolation( PartInterpolation { expression: PropertyAccess( PropertyAccess { expression: Identifier( Identifier { id: "pkgs", span: Span { start: Position { line: 189, column: 26, }, end: Position { line: 189, column: 30, }, }, }, ), attribute_path: [ Raw( PartRaw { content: "coreutils", span: Span { start: Position { line: 189, column: 31, }, end: Position { line: 189, column: 40, }, }, }, ), ], default: None, }, ), }, ), Raw( PartRaw { content: "/bin/kill -HUP $MAINPID", span: Span { start: Position { line: 189, column: 23, }, end: Position { line: 189, column: 64, }, }, }, ), ], span: Span { start: Position { line: 189, column: 22, }, end: Position { line: 189, column: 65, }, }, }, ), }, ), KeyValue( BindingKeyValue { from: [ Raw( PartRaw { content: "StateDirectory", span: Span { start: Position { line: 190, column: 9, }, end: Position { line: 190, column: 23, }, }, }, ), ], to: String( String_ { parts: [ Raw( PartRaw { content: "spamassassin", span: Span { start: Position { line: 190, column: 27, }, end: Position { line: 190, column: 39, }, }, }, ), ], span: Span { start: Position { line: 190, column: 26, }, end: Position { line: 190, column: 40, }, }, }, ), }, ), ], span: Span { start: Position { line: 185, column: 23, }, end: Position { line: 191, column: 8, }, }, }, ), }, ), ], span: Span { start: Position { line: 175, column: 30, }, end: Position { line: 192, column: 6, }, }, }, ), }, ), ], span: Span { start: Position { line: 114, column: 28, }, end: Position { line: 193, column: 4, }, }, }, ), ], }, ), }, ), ], span: Span { start: Position { line: 11, column: 1, }, end: Position { line: 194, column: 2, }, }, }, ), span: Span { start: Position { line: 5, column: 1, }, end: Position { line: 194, column: 2, }, }, }, ), span: Span { start: Position { line: 3, column: 1, }, end: Position { line: 194, column: 2, }, }, }, ), span: Span { start: Position { line: 1, column: 1, }, end: Position { line: 194, column: 2, }, }, }, )