Definition: [
    "autonomous agent",
    {
        "init": "{
        $nom_AA = 'Portal';
        $versio = '0.1.2';
        $_AUT_000 = 'C4KIJSUWVM7BGWTLXKX3K4PNRXV7OY4W';
        $adr__ = trigger.address;
        $args = trigger.data;
        $idgeto = trigger.output[[ asset != base ]].asset;
        $qt = trigger.output[[ asset = $idgeto ]];
        $generics = var[ 'Generics' ];
        $propostes = var[ 'Propostes' ];
        $validacions = var[ 'Validacions' ];
        $ordinals = var[ 'Ordinals' ];
        $getons = var[ 'Getons' ];
        
        
       // Autoritzacions
        $_actuant_es_AUT_000 = $adr__ == $_AUT_000;
        
        $_actuant_es_AUT =
            $_actuant_es_AUT_000 AND ! $generics._AUT_0
            OR $adr__ == $generics._AUT_A
            OR $adr__ == $generics._AUT_0
            OR $adr__ == $generics._AUT_B
            OR $adr__ == $generics._AUT_C;
        
        
       // Funcions
        $__bota = $txt => bounce ( $nom_AA || ' >>> ' || $txt );
        $__ordinal = $rf => $ordinals[ $rf ] ? $ordinals[ $rf ] + 1 : 1;
        $__idprop = $rf => {
           $ordinals[ $rf ] = $__ordinal( $rf );
           $rf || '_' || $ordinals[ $rf ]
        };
        $__data_confirmacio = () => timestamp_to_string( timestamp + $generics.Lapse );
        // Funció: Retorna valor argument lliurat si el troba. Altrament, s'atura
        $__arg = $arg =>
            $args[ $arg ] otherwise 
            $__bota( "Cal proporcionar el valor de: " || $arg );
       // Admin
        if ( $args.admin ) {
          // Bloc Autoritzacions
            if ( $args.admin_geto ) {
                $geto = $getons[ $args.id_geto ];
                $_actuant_es_AUT_geto =
                $_actuant_es_AUT AND ! $geto.variables._AUT_0
                OR $adr__ == $geto.constants._AUT_A
                OR $adr__ == $geto.variables._AUT_0
                OR $adr__ == $geto.variables._AUT_B
                OR $adr__ == $geto.variables._AUT_C;
                // El getó ha d'existir i constar com a actiu
                if ( ! $geto OR $geto.estat != 'actiu' ) 
                { $__bota( 'Getó inexistent o inactiu' ); }
                if ( ! $_actuant_es_AUT_geto )
                { $__bota( 'No autoritzada' ); }
            } else {
                
                if ( ! $_actuant_es_AUT )
                { $__bota( 'No autoritzada' ); }
            }
          // Bloc Validació
            // _AUT_000 pot saltar-se procés validació mentre no existeixi _AUT_0
            if ( ! $_actuant_es_AUT_000 
                OR ( $_actuant_es_AUT_000 AND $generics._AUT_0 ) 
            ) {
                if ( $args.tasca == 'confirmacio' ) {
                    $proposta = $propostes[ $args.idprop ];
                    // La proposta ha d'existir
                    if ( ! $proposta )
                    { $__bota( "No hi ha cap proposta amb aquesta ref" ); }
                    // La confirmació l'ha de fer una AUT diferent a la proposant
                    if ( $proposta.proposant == $adr__ )
                    { $__bota( "El procés de confirmació l'ha d'endegar una altra AUT" ); }
                    // La confirmació només es pot fer quan ha transcorregut el lapse especificat
                    if ( $generics.Lapse > timestamp - $proposta.temps )
                    { $__bota( "Encara no es pot confirmar la proposta" ); }
                    // La proposta ha de constar com a validada
                    if ( ! $validacions[ $args.idprop ] )
                    { $__bota( "La proposta encara no ha estat validada" ); }
                    $tasca = 'confirmacio';
                } else {
                    $ref = $__arg( 'ref' );
                    $val = $__arg( 'val' );
                    // El valor proporcionat no ha de coincidir amb el de la darrera proposta
                    $sufix = $args.admin_geto ? '_' || $args.id_geto : '';
                    $ordinal = $ordinals[ $ref || $sufix ];
                    $darrera_prop = $propostes[ $ref || '_' || $ordinal || $sufix ];
                    
                    if ( $darrera_prop AND $darrera_prop.val == $val )
                    { $__bota( "El valor proposat coincideix amb el de la darrera proposta" ); }
                   
                    $tasca = 'proposta';
                }
            } else { 
                $ref = $__arg( 'ref' );
                $val = $__arg( 'val' );
                $tasca = 'drecera'; }
        }
    }",
        "messages": {
            "cases": [
                {
                    "if": "{ $args.proces == 'acces' }",
                    "init": "{
                    $args._Portal = this_address;
                    $args._FOP = $generics._FOP;
                    $args._Estels = $generics._Estels;
                    $args.geto = $idgeto;
                    $args.qt = $qt;
                }",
                    "messages": [
                        {
                            "app": "data",
                            "payload": "{ $args }"
                        },
                        {
                            "app": "payment",
                            "payload": {
                                "asset": "{ 'base' }",
                                "outputs": [
                                    {
                                        "address": "{ $generics._Acces }",
                                        "amount": "{ $args.qt }"
                                    }
                                ]
                            }
                        }
                    ]
                },
                {
                    "if": "{ $args.admin AND $args.proces == 'nou_portal' }",
                    "messages": [
                        {
                            "app": "state",
                            "state": "{
                            $darrer_portal = var[ $__arg( 'val' ) ];
                            $dades = {
                                Generics : $darrer_portal.Generics,
                                Propostes : $darrer_portal.Propostes,
                                Validacions : $darrer_portal.Validacions,
                                Getons : $darrer_portal.Getons,
                                Ordinals : $darrer_portal.Ordinals,
                                Alteracions : $darrer_portal.Alteracions,
                                Darrer_Portal : $darrer_portal
                            };
                            if ( $tasca == 'drecera' ) {
                                var[ 'Generics' ] = $dades.Generics;
                                var[ 'Propostes' ] = $dades.Propostes;
                                var[ 'Validacions' ] = $dades.Validacions;
                                var[ 'Getons' ] = $dades.Getons;
                                var[ 'Ordinals' ] = $dades.Ordinals;
                                var[ 'Darrer_Portal' ] = $dades.Darrer_Portal;
                            }
                            if ( $tasca == 'confirmacio' ) {
                                $prop = $propostes[ $args.idprop ];
                                var[ 'Generics' ] = $prop.dades.Generics;
                                var[ 'Propostes' ] = $prop.dades.Propostes;
                                var[ 'Validacions' ] = $prop.dades.Validacions;
                                var[ 'Getons' ] = $prop.dades.Getons;
                                var[ 'Ordinals' ] = $prop.dades.Ordinals;
                                var[ 'Darrer_Portal' ] = $prop.dades.Darrer_Portal;
                                response[ 'proposta' ] = $args.idprop;
                            }
                            if ( $tasca == 'proposta' ) {
                                $idprop = $__idprop( $args.proces );
                                
                                $propostes[ $idprop ] =
                                    {
                                        dades: $dades,
                                        proposant: $adr__,
                                        temps: timestamp,
                                    };
                                var[ 'Propostes' ] = $propostes;
                                var[ 'Ordinals' ] = $ordinals;
                                response[ 'proposta' ] = $idprop;
                                response[ 'data confirmació'] = $__data_confirmacio();
                            }
                            response[ 'tasca' ] = $tasca;
                        }"
                        }
                    ]
                },
                {
                    "if": "{ $args.admin AND $args.proces == 'esmena_generics' }",
                    "messages": [
                        {
                            "app": "state",
                            "state": "{
                            if ( ! $generics AND $ref != 'multiple' )
                            { $__bota( "No hi ha generics" ); }
                            if ( $tasca == 'drecera' ) {
                                if ( $ref == 'multiple' ) {
                                    $variables = {};                                    
                                    $__resp = $r => {
                                        $valvar = $args[ $r ] otherwise $generics[ $r ];
                                        $variables[ $r ] = $valvar;
                                        response[ $r ] = $valvar;                                     
                                    };
                                    
                                    $__resp( '_Acces' );
                                    $__resp( '_Getons' );
                                    $__resp( '_FRO' );
                                    $__resp( '_FOP' );
                                    $__resp( '_FDIP' );
                                    $__resp( '_Estels' );
                                    $__resp( 'Interval' );
                                    $__resp( 'Lapse' );
                                    $__resp( '_Transfer' );
                                    $__resp( '_Capacitacio' );
                                    $__resp( '_Avis' );
                                    $__resp( 'Import_Activacio' );
                                    $__resp( 'Import_Subscripcio' );
                                    $__resp( 'Import_Renovacio' );
                                    $__resp( 'Taxa_Conversio' );
                                    $__resp( 'Factor_Conversio' );
                                    $__resp( 'Generacio_Minima' );
                                    $__resp( 'Cicles_Latencia' );
                                    $__resp( '_AUT_0' );
                                    $__resp( '_AUT_A' );
                                    $__resp( '_AUT_B' );
                                    $__resp( '_AUT_C' );
                                    var[ 'Generics' ] = $variables;
                                    
                                    $__valvar = $refvar =>
                                        var[ $refvar ] otherwise {};
                                    var[ 'Getons' ] = $__valvar( 'Getons' );
                                    var[ 'Propostes' ] = $__valvar( 'Propostes' );
                                    var[ 'Validacions' ] = $__valvar( 'Validacions' );
                                    var[ 'Ordinals' ] = $__valvar( 'Ordinals' );
                                } else {
                                    $generics[ $ref ] = $val;
                                    $nova_ref = $ref;
                                    $nou_val = $val;
                                }
                            } else if ( $tasca == 'confirmacio' ) {
                                $generics[ $proposta.ref ] = $proposta.val;
                                $idprop = $args.idprop;
                                $nova_ref = $proposta.ref;
                                $nou_val = $proposta.val;
                            } else {
                                $idprop = $__idprop( $ref );
                                $propostes[ $idprop ] =
                                    {
                                        ref: $ref,
                                        val: $val,
                                        proposant: $adr__,
                                        temps: timestamp,
                                    };
                                var[ 'Propostes' ] = $propostes;
                                var[ 'Ordinals' ] = $ordinals;
                                $nova_ref = $ref;
                                $nou_val = $val;
                                response[ 'data confirmació'] = $__data_confirmacio();
                            }
                            var[ 'Generics' ] = $generics otherwise var[ 'Generics' ];
                            response[ 'procés' ] = $args.proces;
                            response[ 'tasca' ] = $tasca;
                            response[ 'proposta' ] = $idprop otherwise '...';
                            response[ 'nova ref' ] = $nova_ref otherwise '...';
                            response[ 'nou val' ] = $nou_val otherwise '...';
                        }"
                        }
                    ]
                },
                {
                    "if": "{ $args.admin AND $args.proces == 'nou_geto' }",
                    "messages": [
                        {
                            "if": "{ $tasca != 'proposta' }",
                            "app": "asset",
                            "payload": {
                                "cap": "{ $args.cap otherwise 1e9 }",
                                "is_private": false,
                                "is_transferrable": true,
                                "auto_destroy": "{ !! $args.auto_destroy }",
                                "fixed_denominations": false,
                                "issued_by_definer_only": true,
                                "cosigned_by_definer": false,
                                "spender_attested": false
                            }
                        },
                        {
                            "app": "state",
                            "state": "{
                            if ( $tasca != 'confirmacio' ) {
                                $constants = { id : response_unit };
                                // Afegeix constant amb valor argument homònim proporcionat
                                $__const = $r => {
                                    $constants[ $r ] = $__arg( $r );
                                    };
                                $__const( '_FOG' );
                                $__const( '_AUT_A' );
                                $__const( 'factor_conversio' );
                                $__const( 'activacions_restringides' );
                                $__const( 'subscripcions_restringides' );
                                $__const( 'recepcions_restringides' );
                                $__const( 'conversions_restringides' );
                                $__const( 'valors_esmenables' );
                                $__const( 'llistats_editables' );
                                $__const( 'bloqueig_possible' );
                                $variables = {};
                                // Afegeix constant amb valor argument homònim proporcionat
                                $__vari = $r => {
                                    $variables[ $r ] = $__arg( $r );
                                    };
                                $__vari( 'import_activacio' );
                                $__vari( 'import_subscripcio' );
                                $__vari( 'import_renovacio' );
                                $__vari( 'taxa_conversio' );
                                $__vari( 'derivacio_aFOG' );
                                $__vari( '_AUT_0' );
                                $__vari( '_AUT_B' );
                                $__vari( '_AUT_C' );
                            }
                            if ( $tasca == 'drecera' ) {
                                $getons[ response_unit ] =
                                    {
                                        proposant: $adr__,
                                        confirmant: $adr__,
                                        temps: timestamp,
                                        estat: 'actiu',
                                        constants: $constants,
                                        variables: $variables
                                    };
                                response[ 'Getó operatiu' ] = response_unit;
                            }
                            if ( $tasca == 'confirmacio' ) {
                                $idprop = $args.idprop;
                                $prop = $propostes[ $idprop ];
                                $getons[ response_unit ] =
                                    {
                                        proposant: $prop.proposant,
                                        confirmant: $adr__,
                                        temps: timestamp,
                                        estat: 'actiu',
                                        constants: $prop.constants,
                                        variables: $prop.variables
                                    };
                                response[ 'Getó operatiu' ] = $args.idprop;
                            }
                            if ( $tasca == 'proposta' ) {
                                $idprop = $__idprop( $args.proces );
                                $propostes[ $idprop ] =
                                    {
                                        proposant: $adr__,
                                        temps: timestamp,
                                        constants: $constants,
                                        variables: $variables
                                    };
                                var[ 'Propostes' ] = $propostes;
                                var[ 'Ordinals' ] = $ordinals;
                                response[ 'data confirmació'] = $__data_confirmacio();
                            }
                            var[ 'Getons' ] = $getons otherwise var[ 'Getons' ];
                            response[ 'procés' ] = $args.proces;
                            response[ 'tasca' ] = $tasca;
                            response[ 'proposta' ] = $idprop otherwise '...';
                        }"
                        }
                    ]
                },
                {
                    "if": "{ $args.admin AND $args.proces == 'nou_estat_geto' }",
                    "messages": [
                        {
                            "app": "state",
                            "state": "{
                            if ( $tasca == 'drecera' ) {
                                $getons[ $args.id_geto ].estat = $args.nou_estat;
                                response[ 'Nou estat getó ' || $args.id_geto ] = $args.nou_estat;
                            }
                            if ( $tasca == 'confirmacio' ) {
                                $idprop = $args.idprop;
                                $prop = $propostes[ $idprop ];
                                 
                                $getons[ $prop.id_geto ].estat = $prop.estat;
                                response[ 'Nou estat getó ' || $prop.id_geto ] = $prop.estat;
                            }
                            if ( $tasca == 'proposta' ) {
                                $idprop = $__idprop( $args.proces );
                                $propostes[ $idprop ] =
                                    {
                                        proposant: $adr__,
                                        temps: timestamp,
                                        id_geto: $args.id_geto,
                                        estat: $args.estat
                                    };
                                var[ 'Propostes' ] = $propostes;
                                var[ 'Ordinals' ] = $ordinals;
                                response[ 'data confirmació'] = $__data_confirmacio();
                            }
                            var[ 'Getons' ] = $getons otherwise var[ 'Getons' ];
                            response[ 'procés' ] = $args.proces;
                            response[ 'tasca' ] = $tasca;
                            response[ 'proposta' ] = $idprop otherwise '...';
                        }"
                        }
                    ]
                },
                {
                    "if": "{ $args.admin AND $args.proces == 'validacio' }",
                    "init": "{
                    // La confirmació només es pot fer si compte amb el suport d'un nombre
                    // mínim d'ids isox avaluadores d'entre les escollides aleatòriament
                    // La confirmació només es pot fer si compte amb el suport d'un nombre
                    // mínim d'entitats suportants d'entre les escollides aleatòriament
                    //... altres requeriments
                }",
                    "messages": [
                        {
                            "app": "state",
                            "state": "{
                            $validacions[ $args.idprop ] = timestamp;
                            var[ 'Validacions' ] = $validacions;
                            response[ 'Ref proposta validada' ] = $args.idprop;
                        }"
                        }
                    ]
                },
                {
                    "if": "{ $args.admin AND $args.proces == 'esmena_geto' }",
                    "messages": [
                        {
                            "app": "state",
                            "state": "{
                            if ( $tasca == 'confirmacio' ) {
                                
                                $variables = {};
                                $__vari = $r => {
                                    $variables[ $r ] = $args[ $r ] otherwise $geto.variables[ $r ];
                                };
                                $__vari( 'import_activacio' );
                                $__vari( 'import_subscripcio' );
                                $__vari( 'import_renovacio' );
                                $__vari( 'taxa_conversio' );
                                $__vari( 'derivacio_aFOG' );
                                $__vari( '_AUT_0' );
                                $__vari( '_AUT_B' );
                                $__vari( '_AUT_C' );
                                $getons[ $args.id_geto ].variables = $variables;
                                var[ 'Getons' ] = $getons;
                                response[ 'proposta' ] = $args.idprop;
                                response[ 'nova ref' ] = $proposta.ref;
                                response[ 'nou val' ] = $proposta.val;
                            }
                            if ( $tasca == 'proposta' ) {
                                $idprop = $__idprop( $args.proces );
                                $propostes[ $idprop ] =
                                    {
                                        ref: $ref,
                                        val: $val,
                                        proposant: $adr__,
                                        temps: timestamp,
                                    };
                                var[ 'Propostes' ] = $propostes;
                                var[ 'Ordinals' ] = $ordinals;
                                response[ 'proposta' ] = $idprop;
                                response[ 'nova ref' ] = $ref;
                                response[ 'nou val' ] = $val;
                                response[ 'data confirmació'] = $__data_confirmacio();
                            }
                            response[ 'tasca' ] = $tasca;
                        }"
                        }
                    ]
                },
                {
                    "if": "{ $args.proces == 'generacio_getons' }",
                    "init": "{
                    
                    if ( $idgeto != $generics._Estels )
                    { $__bota( 'Cal aportar-hi estels' ); }
                    // El getó ha d'existir i constar com a actiu
                    $geto_conv = $getons[ $__arg( 'id_geto' ) ];
                    if ( ! $geto_conv OR $geto_conv.estat != 'actiu' ) 
                    { $__bota( 'Getó inexistent o inactiu' ); }
                    $_actuant_es_AUT_geto_conv =
                        $_actuant_es_AUT AND ! $geto.variables._AUT_0
                        OR $adr__ == $geto_conv.constants._AUT_A
                        OR $adr__ == $geto_conv.variables._AUT_0
                        OR $adr__ == $geto_conv.variables._AUT_B
                        OR $adr__ == $geto_conv.variables._AUT_C;
                    if ( ! $_actuant_es_AUT_geto_conv )
                    { $__bota( 'No autoritzada' ); }
                    if ( $qt < $generics.Generacio_Minima )
                    { $__bota( 'Cal aportar-hi si més no ' 
                    || $generics.Generacio_Minima || ' estels' ); }
                }",
                    "messages": [
                        {
                            "app": "payment",
                            "payload": {
                                "asset": "{ $args.id_geto }",
                                "outputs": [
                                    {
                                        "address": "{ $getons.constants._FOG }",
                                        "amount": "{ $qt * $getons.constants.factor_conversio }"
                                    }
                                ]
                            }
                        }
                    ]
                }
            ]
        }
    }
]